在PEP 3107和this SO answer中暗示Python3K函數註釋和裝飾器適合手和手套 - 我應該能夠編寫一個可以使用函數屬性的裝飾器。有功能註釋的裝飾器
我不知道如何讓它們按照我的預期工作。
考慮:
def verbose(lcls):
def wrap(f):
print('inside wrap')
def wf(*args):
print('inside wf')
print('lcls in wf:',lcls)
print('locals in wf:',locals())
print('wf annotations:',wf.__annotations__)
print('xYx annotations:',xXy.__annotations__)
r=f(*args)
print('after f(*args)')
return r
return wf
return wrap
@verbose(locals())
def xXy(x: 'x in x\'s', y: 'y in Y\'s') -> ('x times y','in x and y units'):
print('locals in xXy:',locals())
return x*y
xy=xXy(10,3)
print(xy)
打印:
inside wrap
inside wf
lcls in wf: {'xXy': <function verbose.<locals>.wrap.<locals>.wf at 0x109767ef0>, '__doc__': None, 'verbose': <function verbose at 0x109767050>, '__cached__': None, '__builtins__': <module 'builtins'>, '__package__': None, '__file__': '/private/var/folders/gx/gqtmx9mn7b75pk1gfy0m9w3w0000gp/T/Cleanup At Startup/test-383453350.857.txt', '__loader__': <_frozen_importlib.SourceFileLoader object at 0x10959ac10>, '__name__': '__main__'}
locals in wf: {'f': <function xXy at 0x109767e60>, 'args': (10, 3), 'lcls': {'xXy': <function verbose.<locals>.wrap.<locals>.wf at 0x109767ef0>, '__doc__': None, 'verbose': <function verbose at 0x109767050>, '__cached__': None, '__builtins__': <module 'builtins'>, '__package__': None, '__file__': '/private/var/folders/gx/gqtmx9mn7b75pk1gfy0m9w3w0000gp/T/Cleanup At Startup/test-383453350.857.txt', '__loader__': <_frozen_importlib.SourceFileLoader object at 0x10959ac10>, '__name__': '__main__'}, 'wf': <function verbose.<locals>.wrap.<locals>.wf at 0x109767ef0>}
wf annotations: {}
xYx annotations: {}
locals in xXy: {'y': 3, 'x': 10}
after f(*args)
30
什麼該組線顯示的是,我不能看到如何訪問x和y的值XXY的裝飾或xXy的函數屬性。
我會像要做的是1)有一個功能與註釋在PEP 3107指定,2)能夠有一個裝飾器,可以訪問函數的註釋和函數調用的值,而不只是是xXy函數簽名的克隆。
優秀!我正在玩檢查,但我還沒有弄明白。 – 2013-02-25 04:53:12
只是在Py3.3中添加了'inspect.signature',所以對提問者很有用。它在Py 3.0-3.2中不可用。 – cfi 2013-02-25 16:52:04
我正在使用3.3,所以這個工程太棒了!謝謝!! – 2013-02-25 18:16:42