【发布时间】:2010-10-10 02:58:48
【问题描述】:
有没有什么方法可以编写装饰器以使以下内容起作用?
assert 'z' not in globals()
@my_decorator
def func(x, y):
print z
编辑:从 anwser 移出
回答 hop 的“为什么?”:语法糖 / DRY。
这不是关于缓存,而是关于根据 x 和 y 的值计算 z(以及 z1、z2、z3...)。
我有很多函数做相关的事情,我不想写
z1, z2, z3=calculate_from(x, y)
在每个函数的开头 - 我会在某个地方弄错。如果这是 c,我会用 cpp 来做这个(如果这是 lisp,我会用宏来做这个......),但我想看看装饰器是否可以做同样的事情。
如果有帮助,我几乎可以肯定将装饰器称为“precalculate_z”,它肯定不会成为任何公共 API 的一部分。
我可能也可以通过使用类基础结构获得类似的效果,但我想看看它是否可以使用原始函数。
【问题讨论】:
-
我不确定您要在这里完成什么 — 如果
z既不是全局参数也不是函数参数,它来自哪里?或者您想让z静态化? Python 不支持 C 风格的静态变量,但您可以通过将函数放入类中来完成很多相同的事情。 -
我相信他在问“my_decorator”是否可以将局部变量注入它正在装饰的函数体中。