在哪里包装函数
Where to wrap a function
对于包装函数,为什么以下方法不起作用:
# 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__
;如果调用代码是 __main__
,则不会。您需要进行更复杂的检查才能准确地完成您的任务。
您需要将传递的函数包装在进行检查的包装函数中。您在装饰器 运行 时进行检查,这与调用函数时是分开的。
def disallow_main(func):
def wrapper(*args):
if __name__ == '__main__':
raise RuntimeError("Cannot run from main.")
else:
func(*args)
return wrapper
注意 wrapper
是如何返回的,它在完成验证后调用 func
。
对于包装函数,为什么以下方法不起作用:
# 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__
;如果调用代码是 __main__
,则不会。您需要进行更复杂的检查才能准确地完成您的任务。
您需要将传递的函数包装在进行检查的包装函数中。您在装饰器 运行 时进行检查,这与调用函数时是分开的。
def disallow_main(func):
def wrapper(*args):
if __name__ == '__main__':
raise RuntimeError("Cannot run from main.")
else:
func(*args)
return wrapper
注意 wrapper
是如何返回的,它在完成验证后调用 func
。