Python 获取函数的局部变量
我正试图从装饰器中获取一个局部变量。例如:Python 获取函数的局部变量,python,unix,decorator,locals,Python,Unix,Decorator,Locals,我正试图从装饰器中获取一个局部变量。例如: def needs_privilege(privilege, project=None): """Check whether the logged-in user is authorised based on the given privilege @type privilege: Privilege object, id, or str @param privilege: The requested privileg
def needs_privilege(privilege, project=None):
"""Check whether the logged-in user is authorised based on the
given privilege
@type privilege: Privilege object, id, or str
@param privilege: The requested privilege"""
def validate(func, self, *args, **kwargs):
"""Validator of needs_privillige"""
try: check(self.user, privilege, project)
except AccessDenied:
return abort(status_code=401)
else:
return func(self, *args, **kwargs)
return decorator(validate)
class TestClass(object):
def needs_privilege(privilege, project=None):
def wrapper(func):
def validate(self, *args, **kwargs):
"""Validator of needs_privillige"""
print 'validator check for %s' % privilege
return func(*args, **kwargs)
validate.privilege = privilege
return validate
return wrapper
@needs_privilege("foo")
def bar():
print "called"
>>> test.TestClass().bar()
validator check for foo
called
>>> test.TestClass.bar.privilege
'foo'
>>> test.TestClass().bar.privilege
'foo'
修饰函数后,如下所示:
@needs_privilege("some_privilege")
def some_function():
pass
def needs_privilege(privilege, project=None):
def validate(func):
def _validate(self, *args, **kwargs):
return func(self, *args, **kwargs)
_validate.decorator_args=(privilege,project)
return _validate
return validate
@needs_privilege("some_privilege")
def some_function(self):
pass
a = some_function
print(a.decorator_args)
# ('some_privilege', None)
我想从某个函数中检索“privilige”变量(validate()使用)。搜索了一个多小时后,我觉得很迷茫。这可能吗
编辑:
让我更彻底地描述一下我的问题:我可以在不执行某些函数的情况下获得字符串“some_prvilege”吗?比如:
a = getattr(module, 'somefunction')
print a.decorator_arguments
??谢谢你迄今为止对我的帮助 您可以将其作为参数传递:
def needs_privilege(privilege, project=None):
"""Check whether the logged-in user is authorised based on the
given privilege
@type privilege: Privilege object, id, or str
@param privilege: The requested privilege"""
def validate(func, self, *args, **kwargs):
"""Validator of needs_privillige"""
try: check(self.user, privilege, project)
except AccessDenied:
return abort(status_code=401)
else:
return func(self, privilege, *args, **kwargs)
return decorator(validate)
@needs_privilege("some_privilege")
def some_function(privilege):
pass
您的decorator基本上检查用户是否具有执行给定函数的权限,我不理解您为什么要检索(附加)正在包装的函数的权限,但您可以在不向所有函数添加其他参数的情况下执行此操作
def needs_privilege(privilege, project=None):
"""Check whether the logged-in user is authorised based on the
given privilege
@type privilege: Privilege object, id, or str
@param privilege: The requested privilege"""
def validate(func, self, *args, **kwargs):
"""Validator of needs_privillige"""
try: check(self.user, privilege, project)
except AccessDenied:
return abort(status_code=401)
else:
return func(self, *args, **kwargs)
validate.privelege = privelege
return decorator(validate)
顺便说一句,你的装饰师应该是这样的:
def needs_privilege(privilege, project=None):
def validate(func):
def new_func(self, *args, **kwargs):
try:
check(self.user, privilege, project)
except AccessDenied:
return abort(status_code=401)
else:
return func(self, *args, **kwargs)
new_func.privilege = privilege
return new_func
return validate
函数也是可以具有属性的对象。您可以在装饰器中设置属性。下面是一个例子:
def needs_privilege(privilege, project=None):
"""Check whether the logged-in user is authorised based on the
given privilege
@type privilege: Privilege object, id, or str
@param privilege: The requested privilege"""
def validate(func, self, *args, **kwargs):
"""Validator of needs_privillige"""
try: check(self.user, privilege, project)
except AccessDenied:
return abort(status_code=401)
else:
return func(self, *args, **kwargs)
return decorator(validate)
class TestClass(object):
def needs_privilege(privilege, project=None):
def wrapper(func):
def validate(self, *args, **kwargs):
"""Validator of needs_privillige"""
print 'validator check for %s' % privilege
return func(*args, **kwargs)
validate.privilege = privilege
return validate
return wrapper
@needs_privilege("foo")
def bar():
print "called"
>>> test.TestClass().bar()
validator check for foo
called
>>> test.TestClass.bar.privilege
'foo'
>>> test.TestClass().bar.privilege
'foo'
如果不需要
decorator
模块,您的问题会简单得多。
如果您不严格需要decorator
模块,您可以这样编写decorator:
@needs_privilege("some_privilege")
def some_function():
pass
def needs_privilege(privilege, project=None):
def validate(func):
def _validate(self, *args, **kwargs):
return func(self, *args, **kwargs)
_validate.decorator_args=(privilege,project)
return _validate
return validate
@needs_privilege("some_privilege")
def some_function(self):
pass
a = some_function
print(a.decorator_args)
# ('some_privilege', None)
感谢您的回复!但不完全是我想要的。我想在不执行实际函数的情况下将参数传递给needs_privilege(在这个场景中是某个_函数)。谢谢,但这不是我想要的,抱歉。我想在不实际执行函数的情况下检索“privilege”。请看我的编辑。+1我正想办法说同样的话。decorator包增加了问题的复杂性。谢谢!很遗憾,我只能选择一个答案作为解决方案。有几个人提出了基本相同的答案,但不清楚的是您是否需要decorator包(使用
decorator(validate)
)。这是要求吗?不,这不是要求。我的问题在这个帖子中得到了回答(见下文)。谢谢大家!谢谢你的回答!就像我对unutbu所说的,很遗憾我只能选择一个答案!