Шаг 118.
Python: сборник рецептов.
Функции. Определение функций, принимающих только именованные аргументы

    На этом шаге мы рассмотрим особенности создания такой функции.

Задача

    Вам нужна функция, которая принимает только именованные аргументы.

Решение

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

def recv(maxsize, *, block):
    'Receives a message' 
    pass


recv(1024, True)  # TypeError
recv(1024, block=True)  # Ok

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

def mininum(*values, clip=None): 
    m = min(values) 
    if clip is not None:
        m = clip if clip > m else m 
    return m


minimum(1, 5, 2, -5, 10)  # Вернет -5
minimum(1, 5, 2, -5, 10, clip=0) # Вернет 0


Обсуждение

    Обязательные именованные аргументы часто являются хорошим способом увеличить понятность кода при определении необязательных аргументов. Например, посмотрите на такой вызов:

msg = recv(1024, False)

    Пользователь, который незнаком с функцией recv(), не имеет представления о том, что означает аргумент False. С другой стороны, такой вызов будет намного более ясным:

msg = recv(1024, block=False)

    Использование обязательных именованных аргументов часто предпочтительнее трюков с применением **kwargs, поскольку они правильно показываются, когда пользователь просит помощи:

>>> help(recv)
Help on function recv in module __main__:
recv(maxsize, *, block)
Receives a message

    Обязательные именованные аргументы также полезны в более продвинутых применениях. Например, они могут быть использованы для внедрения аргументов в функции, которые применяют правила использования *args и **kwargs для получения всех входных параметров.

    На следующем шаге мы рассмотрим прикрепление информационных метаданных к аргументам функций.




Предыдущий шаг Содержание Следующий шаг