无法理解如何在装饰器内的包装函数中获取参数
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
。
我有这个代码:
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
。