次のデコレータがあります。
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}
2 番目の 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