Рубрики
Без рубрики

Python – Как использовать Functools.wraps

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Есть небольшой известный инструмент, о котором я хотел поговорить сегодня. Это называется Wraps И это часть Functools модуль. Вы можете использовать обертывания в качестве декоратора для фиксации DocStrings и имен оформленных функций. Почему этот вопрос? Сначала это звучит как странный корпус Edge, но если вы пишете API или любой код, который будет использовать кого-то, кроме себя, будет использоваться, то это может быть важно. Причина, когда вы используете самоанализ Python, чтобы выяснить чужой код, украшенная функция вернет неверную информацию. Давайте посмотрим на простой пример, который я повалил Decorum.py :

# decorum.py

#----------------------------------------------------------------------
def another_function(func):
    """
    A function that accepts another function
    """

    def wrapper():
        """
        A wrapping function
        """
        val = "The result of %s is %s" % (func(),
                                          eval(func())
                                          )
        return val
    return wrapper

#----------------------------------------------------------------------
@another_function
def a_function():
    """A pretty useless function"""
    return "1+1"

#----------------------------------------------------------------------
if __name__ == "__main__":
    print(a_function.__name__)
    print(a_function.__doc__)

В этом коде мы украшаем функцию под названием A_Function с другой_функция Отказ Вы можете проверить A_Function Имя и DOCSTRING, печатая их с помощью функции __name__ и __doc__ характеристики. Если вы запускаете этот пример, вы получите следующее для вывода:

wrapper

        A wrapping function

Это не правильно! Если вы запустите эту программу в холостом ходу или переводчике, становится еще более очевидным, как это может получить действительно запутанное, действительно быстро.

>>> import decorum
>>> help(decorum)
Help on module decorum:

NAME
    decorum - #----------------------------------------------------------------------

FILE
    /home/mike/decorum.py

FUNCTIONS
    a_function = wrapper()
        A wrapping function
    
    another_function(func)
        A function that accepts another function

>>> help(decorum.a_function)
Help on function other_func in module decorum:

wrapper()
    A wrapping function

В основном то, что здесь происходит, заключается в том, что декоратор меняет название декорированной функции и Docstring самостоятельно.

Обертывает к спасению!

Как мы исправим этот маленький беспорядок? Разработчики Python дали нам решение в Functools.wraops! Давайте проверим это:

Здесь мы импортируем Wraps от Functools Модуль и используйте его как декоратор для функции вложенной обертки внутри другой_функция Отказ Если вы запустите его на этот раз, выход изменится:

Теперь у нас есть правильное название и DOCSTRING еще раз. Если вы попадете в свой интерпретатор Python, функция справки теперь будет работать правильно. Я пропущу, положив его здесь и оставить это для вас, чтобы попробовать.

Упаковка

Обертывающие декоратор в значительной степени один трюк пони, но это довольно удобно, когда это нужно. Если вы заметите, что ваши функции не дают вам правильное имя или DOCSTRING, то теперь вы знаете, как это легко исправить. Получайте удовольствие счастливого кодирования!