我有以下装饰器:
from decorator import decorator
def my_decorator(key=None, timeout=None, retry=0):
"""
My decorator
"""
import pdb; pdb.set_trace()
def _my_decorator(func):
import pdb; pdb.set_trace()
key = key or func.__name__
@decorator
def __my_decorator(f, *args, **kwargs):
result = "abc"
return result
return __my_decorator(func)
return _my_decorator
在第一个 pdb 部分中,结果locals()
是:
>>> locals()
{'key': None, 'retry': 0, 'pdb': <module 'pdb' from '/opt/python/2.7/lib/python2.7/pdb.pyc'>, 'timeout': None}
在第二个 pdb 部分中,结果locals()
是:
>>> locals()
{'timeout': None, 'retry': 0, 'pdb': <module 'pdb' from '/opt/python/2.7/lib/python2.7/pdb.pyc'>, 'func': <function get_items at 0x9e172cc>}
没有 pdb 的异常:
key = key or func.__name__
UnboundLocalError: local variable 'key' referenced before assignment
您知道为什么key
嵌套函数 _my_decorator 中的参数消失了吗?更奇怪的是,因为timeout
和retry
参数仍然可以访问(尽管这是嵌套函数中的正常行为)。
有一个解决方法:
def my_decorator(key=None, timeout=None, retry=0):
"""
My decorator
"""
key2 = key
def _my_decorator(func):
key = key2 or func.__name__
...
但这不是解决方案(参数key
仍然存在_my_decorator
,但key2
现在可以访问)
Python版本:2.7.3