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Сообщить о неточности