在哪里包装函数

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