На этом шаге мы рассмотрим особенности создания такой функции.
Вам нужна функция, которая принимает только именованные аргументы.
Эту возможность легко реализовать, если вы поместите именованные аргументы после аргумента со звездочкой или символа звездочки. Например:
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 для получения всех входных параметров.
На следующем шаге мы рассмотрим прикрепление информационных метаданных к аргументам функций.