Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取函数的局部变量_Python_Unix_Decorator_Locals - Fatal编程技术网

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所说的,很遗憾我只能选择一个答案!