【发布时间】:2013-07-05 16:20:22
【问题描述】:
如何定义一个装饰器decor 来完成这项工作?有很多关于这个的帖子,但我仍然没有找到解决方案。也许这是一个非常糟糕的主意。
示例1,编写一个函数,直到应用装饰器才被破坏:
defaults = {'a': 1, 'b': 2}
@decor(defaults)
def f(x):
print(x, a, b)
示例 2:
defaults = {'a': 1, 'b': 2}
@decor(defaults)
def fun(x):
print(locals())
f(3)
应该给
{'b': 2, 'x': 3, 'a': 1}
或者更清楚一点,我希望装饰器修改签名,以便 help(f) 给出
Help on function f in module __main__:
f(x, a=1, b=2)
【问题讨论】:
-
不要!动态修改 local 变量确实是错误的,而且实际上很难可靠地实现而不在程序中引入严重的安全风险。如果您提供一些上下文,您可能会发现有 3-4 种更好的方法可以实现您想要的,而无需这样做。
-
如果不重写
f字节码,您就无法做到这一点。你真的不想去那里。你真正想解决什么问题? -
不是重复的,但这可能会有所帮助:stackoverflow.com/questions/5929107/…
-
从根本上说,您将如何使用它?您的装饰函数必须引用“默认”变量才能使用它们。鉴于此,使用此装饰器将使您的代码更加更难阅读。不要这样做。
-
@mathtick 这将使维护变得更加困难。