Python装饰器工厂调用语法解析及相关疑问
咱们一步步拆解你的问题,把这个装饰器调用的逻辑理清楚:
1. check_user_is_not("user123")到底是什么?
check_user_is_not是一个装饰器工厂函数——它的作用不是直接装饰函数,而是根据传入的参数(这里是"user123")生成并返回一个具体的装饰器。
当你调用check_user_is_not("user123")时,它会执行外层函数的逻辑,创建并返回内部的user_check_decorator函数。这个返回的user_check_decorator才是真正能接收被装饰函数(比如Store.get_food)的装饰器。
2. 额外添加括号的写法是否等价?
完全等价!你写的check_user_is_not("user123")( (Store.get_food) )和原语句check_user_is_not("user123")(Store.get_food)没有任何区别。
这里的外层括号只是给Store.get_food加了个“包裹”,但Python会忽略这种不改变优先级的冗余括号——Store.get_food本身就是一个函数对象,加不加括号都不会改变它的本质,所以两种写法最终都会把Store.get_food作为参数传给check_user_is_not("user123")返回的装饰器函数。
3. 这类调用有特定名称吗?
这种写法其实是手动模拟装饰器语法糖的执行过程。平时我们用@语法糖的时候,比如:
@check_user_is_not("user123") def get_food(username): # 函数逻辑
Python会自动帮你执行get_food = check_user_is_not("user123")(get_food)这个操作。而你代码里的Statement 1和Statement 2,就是手动完成了语法糖背后的这步赋值操作,本质上就是对装饰器工厂返回的装饰器进行手动调用,来完成函数的装饰。
内容的提问来源于stack exchange,提问作者Mak2006

