【发布时间】:2020-07-19 09:51:04
【问题描述】:
这是来自严重 Python 中的代码 sn-p,我在理解调用语法时遇到了问题。 check_user_is_not 是一个装饰器工厂,它返回一个装饰器。其余的语法也很简单。工厂定义如下。
def check_user_is_not(username):
def user_check_decorator(f):
def wrapper(*args, **kwargs):
if kwargs.get('username') == username:
raise Exception("This user is not allowed to get food")
return f(*args, **kwargs)
return wrapper
return user_check_decorator
问题出在通话中。
class Store(object):
def get_food(self, username, food):
return self.storage.get(food)
Store.get_food = check_user_is_not("user123")(Store.get_food) # Statement 1
Store.get_food = check_user_is_not("admin")(Store.get_food) # Statement 2
语句 1 和语句 2 导致我的理解出现问题。 check_user_is_not("user123") 是什么?如果这是一个返回的函数,然后我们用另一个函数 Store.get_food 调用该函数,那么语法应该是
Store.get_food = check_user_is_not("user123")( (Store.get_food) ) # not sure if valid
我已经添加了额外的括号来将其视为调用。这个说法应该怎么理解?
我检查了其他装饰器问题,例如here,确实找到了与print_hi = repeat(num_times=4)(print_hi) 类似的代码。
这两个陈述是否有效且相同?
Store.get_food = check_user_is_not("user123")( (Store.get_food) ) # not sure if valid`
#vs
Store.get_food = check_user_is_not("user123")(Store.get_food)
这种类型的电话有什么具体的名字吗?
【问题讨论】:
-
我不明白您为什么认为需要额外的括号。
check_user_is_not(<whatever>)返回一个函数,你调用那个函数,check_user_is_not(<whatever>)(<something else>)... 这个没有名字,这只是一个普通的函数调用,和其他函数一样 -
所以,
check_user_is_not("user123")( (Store.get_food) )是有效的,但是分组括号不是必须的,可以是check_user_is_not("user123")( Store.get_food ) -
谢谢,所以这是一个通用的函数调用。实际上括号已经在那里了。
标签: python-3.x decorator