无法理解如何在装饰器内的包装函数中获取参数

Can't understand how parameters get fetched inside the wrapper function inside a decorator

我有这个代码:

class User:
    def __init__(self, name):
        self.name = name
        self.is_logged_in = False

def is_authenticated_decorator(function):
    def wrapper(*args, **kwargs):
        if args[0].is_logged_in == True:
            function(args[0])
    return wrapper

@is_authenticated_decorator
def create_blog_post(user):
    print(f"This is {user.name}'s new blog post.")

new_user = User("angela")
new_user.is_logged_in = True
create_blog_post(new_user)

我不明白 create_blog_post(user) 的参数是如何在包装器的输入中获取的。

我明白

@is_authenticated_decorator
def create_blog_post(user):

相当于

create_blog_post = is_authenticated_decorator(create_blog_post)

我了解 create_blog_post 成为包装器

我知道 create_blog_post(user) 调用 wrapper(user)

我就是不明白怎么办?!

有人可以解释一下 route/path 用户参数最终出现在包装函数中吗? 谢谢 非常感谢您的回答。

确实:

装修归结为create_blog_post = is_authenticated_decorator(create_blog_post)

这意味着我们调用 returns wrapper 的装饰器,但将其 function 参数特定绑定到我们原来的 create_blog_post。为方便起见,我们将原来的 create_blog_post 称为 original_create_blog_post。所以is_authenticated_decorator中的return语句returns这个函数:

def wrapper(*args, **kwargs):
    if args[0].is_logged_in == True:
        original_create_blog_post(args[0])

function 已替换为 orginal_create_blog_post,因为这是我们为 function 参数提供的值)

通过将返回值赋值回 create_blog_post,我们将其定义为:

def create_blog_post(*args, **kwargs):
    if args[0].is_logged_in == True:
        original_create_blog_post(args[0])

如果我们扩展我称之为 original_create_blog_post 的定义,我们得到:

def create_blog_post(*args, **kwargs):
    if args[0].is_logged_in == True:
        print(f"This is {args[0].name}'s new blog post.")

现在当我们调用 create_blog_post(user) 时,变量 args[0]user