【发布时间】:2018-12-14 08:25:03
【问题描述】:
如果调用函数(此处为 decorated 或 not_decorated)具有特定的装饰器(代码为 @out),是否有任何方法可以检查函数 f1 的内部?是否将此类信息传递给函数?
def out(fun):
def inner(*args, **kwargs):
fun(*args, **kwargs)
return inner
@out
def decorated():
f1()
def not_decorated():
f1()
def f1():
if is_decorated_by_out: # here I want to check it
print('I am')
else:
print('I am not')
decorated()
not_decorated()
预期输出:
I am
I am not
【问题讨论】:
-
你可以在
out()返回的函数中添加一个属性,它的存在可以在f1()中检查。 -
让一个函数尝试检查调用它的代码的任何内容通常是最后的手段——您应该尝试寻找其他方法将必要的信息放入您的函数中,或者重新考虑您是否真的需要它。
-
我将
in更改为inner。in是保留字,因此调用或返回in不起作用 -
理论上,你的装饰器可以在它正在装饰的函数上设置一个属性。主要问题是函数不能引用自身(因此您无法检查
f1是否在f1中具有该属性),为此您将需要另一个装饰器。见stackoverflow.com/questions/5063607/… -
“装饰”函数本身不会留下任何痕迹。
@out def decoratd()...只是def decorated(): ...; decorated = out(decorated)的语法糖。