Что означает косая черта / в сигнатуре метода Python, как показано в help(foo)?

В подписи, возвращаемой интерактивно help(foo), что означает /?

In [37]: help(object.__eq__)

Help on wrapper_descriptor:

__eq__(self, value, /)
    Return self==value.

In [55]: help(object.__init__)

Help on wrapper_descriptor:

__init__(self, /, *args, **kwargs)
    Initialize self.  See help(type(self)) for accurate signature.

Я думал, что это может быть связано с аргументами, состоящими только из ключевых слов, но это не так. Когда я создаю свою собственную функцию с аргументами, состоящими только из ключевых слов, позиционные аргументы и аргументы, содержащие только ключевые слова, разделяются * (как и ожидалось), а не /. Что означает /?


person gerrit    schedule 30.01.2015    source источник


Ответы (1)


Как объясняется здесь, '/' в качестве аргумента отмечает конец аргументов, которые являются только позиционными (см. здесь), то есть аргументы, которые вы не можете использовать в качестве параметров ключевого слова. В случае __eq__(self, value, /) косая черта стоит в конце, что означает, что все аргументы помечены как позиционные только, в то время как в случае вашего __init__ только self, т.е. ничего, только позиционные.

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

# a, b are positional-only. e,f keyword-only
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

# valid call
f(10, 20, 30, d=40, e=50, f=60)

# invalid calls:
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
person runDOSrun    schedule 30.01.2015