Вот что я узнал…

Функции только с именованными аргументами 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)

Вот как-то так. Возможно это может быть полезно.


Собственно вот что сегодня я узнал…