Именованные сущности в определениях типов, поддерживающих вызов, определяющие то, какие аргументы могут быть приняты при вызове.
Внимание
Параметры и аргументы — две разные сущности, которые не следует путать между собой.

Параметры могут использоваться *для обозначения как обязательных, так и необязательных аргументов*.

Когда один или более параметров имеют форму параметр=выражение, говорят, что заданы параметры по умолчанию. Для параметров по умолчанию, соответствующий ему аргумент может быть опущен при вызове и тогда будет использовано значение по умолчанию.

Внимание
Если для параметра определено значение по умолчанию, все последующие за ним параметры до * должны также иметь значения по умолчанию.

def func(a, b=None):
print(a, b)


func()
# TypeError: func() missing 1 required positional argument: 'a'

func(1) # (1, None)

Типы параметров

1. позиционный-или-именованный


Используется для обозначения аргумента, который может быть передан либо как позиционный, либо как именованный. Этот тип параметра используется по умолчанию:

# Здесь a и b - позиционные-или-именованные.
def func(a, b=None):
print(a, b)


func(a=1, b=2) # (1, 2)
func(1, b=2) # (1, 2)
func(1, 2) # (1, 2)

2. только-позиционный


Используется для обозначения аргумента, который может быть передан только в определённой позиции. Начиная с версии +py3.0 (PEP 570) Питон предоставляет средства для определения подобных параметров. До этого момента, такие параметры использовались лишь в некоторых встроенных функциях, например в abs().

Для отделения «только-позиционных» от прочих (позиционных, именованных.) исользуется / (косая черта, слэш):

    # Здесь pos1 и pos2 - только-позиционные.
def func(pos1, pos2, /, pos_or_kw):
print(pos1, pos2, pos_or_kw)


func(1, 3, pos_or_kw=2) # 1 3 2

func(1, pos2=3, pos_or_kw=2)
# TypeError: func() got some positional-only arguments passed as keyword arguments: 'pos2'

3. только-именованный


Поддержка добавлена в +py3.0 (PEP 3102). Используется для обозначения аргумента, который может быть передан только с использованием его имени. Данный тип можно задать, указав единственный вариационно-позиционный параметр, либо добавив * перед нужными параметрами.

    # Здесь kw_only1 и kw_only2 - только-именованные.
def func(*args, kw_only1, kw_only2):
print(args, kw_only1, kw_only2)


func(1, 4, kw_only1=2, kw_only2=3) # (1, 4) 2 3


def func(arg, *, kw_only1, kw_only2):
print(arg, kw_only1, kw_only2)


func(1, 2, 3)
# TypeError: func() takes 1 positional argument but 3 were given

func(1, kw_only1=2, kw_only2=3) # 1 2 3

4. вариационно-позиционный


Используется для обозначения какой-либо последовательности позиционных аргументов (в дополнение к тем позиционным аргументам, которые уже принимаются другими параметрами). Данный тип можно задать добавив перед именем параметра *.

# Здесь args - вариационно-позиционный.
def func(*args):
print(args)

func(a=1)
# TypeError: func() got an unexpected keyword argument 'a'

func(1, 2) # (1, 2)
func(1, 2, 3, 4) # (1, 2, 3, 4)

5. вариационно-именованный


Используется для обозначения любого количества именованных аргументов (в дополнение к тем именованным аргументам, которые уже принимаются драгими параметрами). Данный тип можно задать добавив перед именем параметра **.

# Здесь kwargs - вариационно-позиционный.
def func(**kwargs):
print(kwargs)


func(0)
# TypeError: func() takes 0 positional arguments but 1 was given

func(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}

На заметку
Модуль inspect, помимо прочего, предоставляет средства для получения информации о параметрах функции, в частности inspect.Parameter.

Синонимы поиска: Параметры вызываемых объектов, параметры, args, kwargs, ключевые слова
В разделе «Callable (вызываемый)»: def (функция/метод) Аргументы вызова
На заметку
Читайте нас в Twitter. Ссылка в самом низу страницы.