对于包装函数,为什么以下方法不起作用:
# 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)
也就是说,为什么在定义函数之前将其引发?包装应该如何正确构造?
答案 0 :(得分:0)
如评论中所述,这解释了为什么在进行检查时会进行检查,但仍然没有执行您想要的操作。此检查仅检查包含disallow_main
的模块是否为__main__
;如果调用代码是__main__
,则不是。您将需要进行更复杂的检查才能准确执行您要执行的操作。
您需要将传递的函数包装在执行检查的包装函数中。在装饰器运行时进行检查,这与调用函数时分开。
def disallow_main(func):
def wrapper(*args):
if __name__ == '__main__':
raise RuntimeError("Cannot run from main.")
else:
func(*args)
return wrapper
请注意如何返回wrapper
,并在完成验证后调用func
。