Что означает косая черта в выводе help ()?

148

Что делает /среднее в Python 3.4 в helpвыходе на rangeперед закрывающей скобкой?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...
Joschua
источник

Ответы:

185

Это означает конец только позиционных параметров , параметров, которые нельзя использовать в качестве параметров ключевых слов. До Python 3.8 такие параметры могли быть указаны только в C API.

Это означает, что keyаргумент to __contains__может быть передан только через position ( range(5).__contains__(3)), а не как ключевое слово аргумент ( range(5).__contains__(key=3)), что можно сделать с помощью позиционных аргументов в функциях чистого Python.

Также смотрите документацию Argument Clinic :

Чтобы пометить все параметры как только позиционные в Argument Clinic, добавьте знак « /a» в строке после последнего параметра, с таким же отступом, как и строки параметров.

и (очень недавнее дополнение к) Python FAQ :

Косая черта в списке аргументов функции означает, что предшествующие ей параметры являются только позиционными. Только позиционные параметры - это те, которые не имеют внешнего имени. При вызове функции, которая принимает только позиционные параметры, аргументы сопоставляются с параметрами, основываясь исключительно на их позиции.

Синтаксис теперь является частью спецификации языка Python, начиная с версии 3.8 , см. PEP 570 - Только позиционные параметры Python . До PEP 570 синтаксис был уже зарезервирован для возможного будущего включения в Python, см. PEP 457 - Синтаксис для позиционных параметров .

Только позиционные параметры могут привести к более чистым и понятным API, сделать реализации на чистом Python других модулей C-only более согласованными и более простыми в обслуживании, а поскольку параметры только позиционирования требуют очень небольшой обработки, они приводят к более быстрому коду Python.

Мартейн Питерс
источник
23

Я задавал этот вопрос сам. :) Выяснили, что /изначально был предложен Гвидо здесь .

Альтернативное предложение: как насчет использования «/»? Это своего рода противоположность «*», что означает «аргумент ключевого слова», а «/» не является новым символом.

Тогда его предложение победило .

Хех. Если это правда, мое предложение «/» выигрывает:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Я думаю, что очень актуальным документом, охватывающим это, является ПКП 570 . Где резюме раздел выглядит красиво.

резюмировать

Вариант использования определит, какие параметры использовать в определении функции:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

В качестве руководства:

Используйте только позиционные имена, если имена не имеют значения или не имеют значения, и есть только несколько аргументов, которые всегда будут передаваться в одном и том же порядке. Используйте только ключевые слова, когда имена имеют значение, а определение функции более понятно, если явно указывать имена.


Если функция заканчивается /

def foo(p1, p2, /)

Это означает, что все функциональные аргументы являются позиционными.

прости
источник
6
Выбор /токена, потому что «это обратная операция *» показывает, что Python просто немного сумасшедший. Это своего рода синестезия.
Томаш Гандор
7

Прямая косая черта (/) указывает, что все аргументы, предшествующие этому, являются позиционным аргументом. Функция только позиционных аргументов была добавлена ​​в Python 3.8 после принятия PEP 570 . Первоначально эта нотация была определена в PEP 457 - Нотация для нотации только для позиционных параметров.

Параметры в определении функции до косой черты Foraward (/) являются только позиционными, а параметры, сопровождаемые косой чертой (/), могут быть любого типа в соответствии с синтаксисом. Где аргументы отображаются в позиционные параметры только на основе их положения при вызове функции. Передача только позиционных параметров по ключевым словам (имя) недопустима.

Давайте возьмем следующий пример

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

Здесь в приведенном выше определении функции параметры a и b являются только позиционными, в то время как x или y могут быть позиционными или ключевыми словами.

Следующие вызовы функций действительны

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

Но следующий вызов функции недопустим, что вызывает исключение TypeError, поскольку a, b не передаются как позиционные аргументы, а передаются как ключевое слово

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo () получил некоторые позиционные аргументы, переданные в качестве аргументов ключевого слова: 'a, b'

Многие встроенные в Python функции принимают только позиционные аргументы, когда передача аргументов по ключевому слову не имеет смысла. Например, встроенная функция len принимает только один позиционный (единственный) аргумент, где вызов len как len (obj = "hello world") ухудшает читабельность, проверьте help (len).

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Только позиционные параметры позволяют легко поддерживать базовые функции c / library. Это позволяет в будущем изменять имена параметров только позиционных параметров без риска нарушения кода клиента, использующего API.

И последнее, но не менее важное: позиционные параметры позволяют нам использовать их имена для использования в аргументах ключевых слов переменной длины. Проверьте следующий пример

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

Позиционные параметры только лучше Объяснено здесь в Типах аргументов функции в python: Позиционные Только Параметры

Синтаксис только для позиционных параметров был официально добавлен в python3.8. Оформить заказ Что нового python3.8 - позиционные только аргументы

Связанный с PEP: PEP 570 - только позиционные параметры Python

neotam
источник