我在python中创建装饰器时遇到了一个有趣的场景。以下是我的代码: -
class RelationShipSearchMgr(object):
@staticmethod
def user_arg_required(obj_func):
def _inner_func(**kwargs):
if "obj_user" not in kwargs:
raise Exception("required argument obj_user missing")
return obj_func(*tupargs, **kwargs)
return _inner_func
@staticmethod
@user_arg_required
def find_father(**search_params):
return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)
如上面的代码所示,我创建了一个装饰器(在类中是静态方法),它检查是否" obj_user"作为参数传递给修饰函数。我已经修饰了函数find_father
,但我收到以下错误消息: - 'staticmethod' object is not callable
。
如何使用如上所示的静态实用方法,作为python中的装饰器?
提前致谢。
答案 0 :(得分:2)
staticmethod
是描述符。 @staticmethod
返回描述符对象而不是function
。这就是为什么它会引发staticmethod' object is not callable
。
我的答案就是避免这样做。我不认为有必要使user_arg_required
成为静态方法。
经过一番游戏之后,我发现如果您仍然想使用静态方法作为装饰器,那就有黑客攻击。
@staticmethod
@user_arg_required.__get__(0)
def find_father(**search_params):
return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)
此文档将告诉您什么是描述符。
答案 1 :(得分:0)
在挖掘了一下之后,我发现staticmethod对象有__func__
内部变量__func__
,它存储了要执行的原始函数。
所以,以下解决方案对我有用: -
@staticmethod
@user_arg_required.__func__
def find_father(**search_params):
return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)