在最近阅读这篇关于 Python 装饰器的文章时,它举例说明了作为 Python 装饰器应用程序的记忆技术。虽然我对 Python 装饰器有一定的了解,但我希望了解更多这样有效的装饰器用例,以及您通常如何在日常代码中使用它们。
问问题
1003 次
4 回答
2
有许多可用的内置装饰器,例如classmethod
、property
、staticmethod
和functools.wrap
。编写一个装饰器来记录函数的使用情况以进行调试通常很方便。这个 Python wiki 页面上有很多示例装饰器,尽管我认为至少其中一些更旨在展示 Python 的灵活性,而不是实际提供有用的功能。
于 2012-04-12T12:18:32.587 回答
2
由于 Python 3 支持类型注释,因此可以使用装饰器作为检查的一种方式。
def check(f):
def _f(x):
if type(x) != f.__annotations__['x']:
raise TypeError(type(x))
val = f(x)
if 'return' in f.__annotations__ and f.__annotations__['return'] != type(val):
raise TypeError(type(val))
return val
return _f
@check
def f(x: int) -> int:
return x * 2
>>> f(2)
4
>>> f('x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in _f
TypeError: <class 'str'>
于 2012-04-12T12:27:46.377 回答
0
auth
您可以在 Django Web 框架文档中查看 Python 装饰器的有效用例。明显的例子(我个人每天都在使用)包括使用装饰器来限制经过身份验证的用户的视图,根据特定的用户权限限制访问等。
于 2012-04-12T12:14:23.423 回答
0
这是一个实际的例子。看看有没有备忘录的斐波那契数列总和。
from functools import wraps
def memo(func):
cache = {}
@wraps(func)
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
def fib(i):
if i < 2: return 1
return fib(i-1) + fib(i-2)
@memo
def fib_memo(i):
if i < 2: return 1
return fib_memo(i-1) + fib_memo(i-2)
现在测试速度差异!
>>> print fib(200)
...
>>> print fib_memo(200)
...
于 2012-04-12T12:17:25.017 回答