Вот что я узнал…
Функции только с именованными аргументами kwargs
Если нужно сделать функцию, которая поддерживает только именованные аргументы и запретить позиционные, мы можем писать так:
def foo(*, a, b, c):
return a + b + c
Вызываем с позиционными аргументами:
foo(1, 2, 3)
TypeError: foo() takes 0 positional arguments but 3 were given
Получаем ошибку. Но зато:
foo(c=1, a=2, b=3)
6
Функции только с позиционными аргументами args
До недавнего времени я думал, что если хочется сделать наоборот, то тут уже придется написать свою логику. Но сприходом Python 3.8 появился встроенный механизм и теперь если хочется указать функцию только с позиционными аргументами, нам достаочно написать так:
def foo(a, b, c, /):
return a + b + c
foo(1,2,3) # Ok
foo(a=1, b=2, c=3)
TypeError: foo() got some positional-only arguments passed as keyword arguments: 'a, b, c'
Добавляя / , вы указываете, что аргументы является позиционными. Вы также можете комбинировать обычные аргументы с позиционными только, поместив обычные аргументы после косой черты:
def foo(a, b, c, /, foo):
return a + b + c + foo
foo(1, 2, 3, foo=456)
Ну и на финалочку, если вы скомбинируете /и * , то ошибки не будет, но смысла в этом так же не будет:
def foo(a, b, c, /, *, foo):
return a + b + c + foo
foo(1, 2, 3, foo=456)
Вот как-то так. Возможно это может быть полезно.
Собственно вот что сегодня я узнал…