关于 python 的属性__wrapped__

2014-03-01 07:28:07 +08:00
 jxwho
问个小白问题,假如写decorator的时候,调用functools里面的wraps,比如说
def timethis(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
return wrapper

然后我创建时,
@timethis
def countdown(n):
while n > 0:
n--

请问,countdown有__wrapped__这个属性吗?
因为我看书上它是说用countdown.__wrapped__来unwrap decorator,但是我自己用的时候貌似没有这个属性,是不是要自己在第一个函数里面赋值?比如,wrapper.__wrapped__ = func 这样?
谢谢!
3825 次点击
所在节点    Python
1 条回复
mengzhuo
2014-03-01 14:55:44 +08:00
自己试试看不就知道了————_没有_

至于unwrap,去掉decorator不就好了吗……

:def log(func):
...:@functools.wraps(func)
...:def wrapper(*args, **kwargs):
.......:return func(*args, **kwargs)
...:return wrapper

:@log
:def print_b(name):
...:"""hehe"""
...:print name

In [10]: dir(print_b)
Out[10]:
['__call__',
'__class__',
'__closure__',
'__code__',
'__defaults__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__get__',
'__getattribute__',
'__globals__',
'__hash__',
'__init__',
'__module__',
'__name__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'func_closure',
'func_code',
'func_defaults',
'func_dict',
'func_doc',
'func_globals',
'func_name']

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/102380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX