为什么调用python装饰函数?

Why python decorating function is invoked?

练习 python 3.8

import functools


def print_name2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print('2: {} has been revoked'.format(f.__name__))
        return f(*args, **kwargs)
    return wrapper


def print_name3(f):
    print('3: {} has been revoked'.format(f.__name__))
    return f


@print_name3
def my_str(i):
    return str(i)


@print_name2
def my_str2(i):
    return str(i)

一旦我 运行 代码,我得到

3: my_str has been revoked

这让我很困惑,因为我还没有进行任何函数调用

在python中,装饰器是在装饰点执行的。 您的代码等同于:

import functools

def print_name2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print('2: {} has been revoked'.format(f.__name__))
        return f(*args, **kwargs)
    return wrapper


def print_name3(f):
    print('3: {} has been revoked'.format(f.__name__))
    return f

def my_str(i):
        return str(i)
my_str = print_name3(my_str)

def my_str2(i):
    return str(i)
my_str2 = print_name2(my_str2)

我们基本上用 decorator-function returns 替换 my_str 和 my_str2。现在,print_name2 returns 一个打印内容的新函数,因此什么也不打印。同时,print_name3 立即打印一些东西,因为你没有将它包装在一个新函数中。