在哪里包装功能

时间:2019-10-28 00:26:55

标签: python wrapper python-decorators

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

# 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)

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

1 个答案:

答案 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