«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сохранить функциональные подписи при использовании декораторов в Python?

Как сохранить функциональные подписи при использовании декораторов в Python?

Опубликовано в 2025-03-24
Просматривать:327

How to Preserve Function Signatures When Using Decorators in Python?

сохранение подписей украшенных функций

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

:

рассмотрим общий декоратор, который преобразует все аргументы в целые числа:

def args_as_ints(f):
    def g(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return f(*args, **kwargs)
    return g

kwargs = dict ((k, int (v)) для k, v in kwargs.items ()) возврат f (*args, ** kwargs) возврат g

, В то время как украшение работает, как и ожидалось, подпись декорированной функции заменяется "

args, *kwargs", потерю информации о исходных аргументах.

    вручную копируя подпись в DocString.
  • Создание нового декоратора для каждой конкретной подписи.
  • вручную построить украшенную функцию с Exec. Элегантное решение:
импорт декоратор @Decorator.decorator def args_as_ints (f, *args, ** kwargs): args = [int (x) для x в args] kwargs = dict ((k, int (v)) для k, v in kwargs.items ()) вернуть f (*args, ** kwargs)

] Этот декоратор сохраняет подпись исходной функции, передавая ее в качестве аргументов в обернутую функцию.

улучшенный декоратор:

import decorator

@decorator.decorator
def args_as_ints(f, *args, **kwargs):
    args = [int(x) for x in args]
    kwargs = dict((k, int(v)) for k, v in kwargs.items())
    return f(*args, **kwargs)
@ def funny_function (x, y, z = 3): "" "Вычисляет x*y 2*z" "" " Вернуть x*y 2*z

теперь, украшенная функция funny_funct Помощь на функции Funny_function в модуле __main__: funning_function (x, y, z = 3) Вычисляет x*y 2*z

Python 3.4:

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y   2*z"""
    return x*y   2*z

import functools def args_as_ints (func): @functools.wraps (func) def warper (*args, ** kwargs): args = [int (x) для x в args] kwargs = dict ((k, int (v)) для k, v in kwargs.items ()) вернуть фонд (*args, ** kwargs) return warper
>>> help(funny_function)
Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y   2*z
, используя эти методы, декораторы могут повысить функциональность функции, сохраняя их исходные подписи, обеспечивая ясность и согласованность в кодовой базе.

Заявление о выпуске Эта статья воспроизводится: 1729155261. Если есть какие -либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3