Подтвердить что ты не робот

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

Что означает / в 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.

                                        ...
4b9b3361

Ответ 1

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

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

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

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

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

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

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

Этот PEP недавно был восстановлен и принят для включения в Python. Поскольку Python 3.8 все еще находится в альфа-фазе, он может стать реальностью в этой версии или в 3.9 в зависимости от того, насколько быстро будет завершена эталонная реализация.

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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


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

def foo(p1, p2, /)

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