函数的包装位置



对于包装器函数,为什么以下方法不起作用:

# 3. DISALLOW EXECUTION IN MAIN
def disallow_main(func):
if __name__ == '__main__':
raise RuntimeError("Cannot run from main.")
return func
@disallow_main
def echo(prompt='-> '):
_inp = input(prompt)
print ("ECHO: %s" % _inp)

也就是说,为什么在定义函数之前会引发?包装应如何正确构建?

正如注释中所指出的,这解释了为什么检查在此时进行,但仍然没有按照您的意愿进行。此检查仅检查包含disallow_main的模块是否为__main__;如果呼叫代码是CCD_ 3则不是。你需要一个更复杂的检查来做你想要做的事情。


您需要将传递的函数包装在执行检查的包装函数中。您在运行装饰器时进行检查,这与调用函数时是分开的。

def disallow_main(func):
def wrapper(*args):
if __name__ == '__main__':
raise RuntimeError("Cannot run from main.")
else:
func(*args)
return wrapper

请注意wrapper是如何返回的,并且它在完成验证后调用func

最新更新