我正面临一个奇怪的问题,我请求你的帮助。以下是详细信息: -
在理解装饰器并将其应用于我的工作时,我有这样的场景: -
def f3(funcA, **kw): ## Decorates f2 and acts like a prerequisite for f2 to work
## code to setup pre-conditions ##
requestObj = GetRequestObj()
kw['requestObj']=requestObj
def inner(funcB, **k):
k.update(kw)
## do something ##
return funcA(funcB, **k)
return inner
def f2(func, **kw): # decorates f1 and acts like a prerequisite for f1 to work
kw['serverObject']=kw['requestObj'].GetServerObject()
def inner(**k):
k.update(kw)
return func(**k)
return inner
f2=f3(f2)
def f1(**kw):
##Do something on the requestObj and serverObj in kw
f1=f2(f1)
在这里,我知道f1和f2将是装饰函数。而且,事情一直在发挥作用。
现在,我要求在function f3
中,我应该根据一个参数调用code to setup pre-conditions
,该参数应该通过来自f1
的调用传递,即f1
决定是否f3中的code to setup pre-conditions
是否运行。
PS:我需要致电f1
,如:f1(setup_pre_conditions=True)
我的解决方案:
我可以考虑将所有这些函数放在一个类中,并动态设置flag
变量到True
或False
并使用f3
中的标志变量来决定是否{应该调用{1}}。但是,使用这种方法,我每次都必须创建这个类的新对象。
修改 我只是想到了另一个解决方案。如果它是正确的,你可以指导我!
让我们将所有代码放在内部函数中,这样它们就可以完全控制从链接装饰器的顶层到最低层
我有更好的方法吗?