Python Glossary English

Python 3.8+Функцииконструкция

Только позиционные параметры /

параметры

Параметры левее / в def передаются только по позиции: f(1, 2), но не f(a=1). Так устроены многие встроенные функции, например len().

Синтаксис

def f(поз_1, поз_2, /, обычный, *, именованный): ...

Главная ловушка — / и * вместе: левее / — только позиционные, правее * — только именованные, между ними — любые; def f(a, /, *, b) принимает f(1, b=2) и отвергает и f(a=1, b=2), и f(1, 2). Имя позиционного параметра не занято для **kwargs: def f(name, /, **kw) спокойно примет f('x', name='y'). Берите /, когда имя параметра не несёт смысла или вы хотите менять его, не ломая вызовы.

Примеры

def power(base, exp, /, *, mod=None):
    return pow(base, exp, mod)
print(power(2, 10))  # → 1024
print(power(2, 10, mod=1000))  # → 24
power(2, 10, 1000)  # → TypeError
def power(base, exp, /):
    return base ** exp
power(base=2, exp=10)  # → TypeError
def tag(name, /, **attrs):
    return name, attrs
print(tag('a', name='link'))  # → ('a', {'name': 'link'})
len(obj=[1, 2])  # → TypeError — у len() параметр только позиционный

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности