Python 在哪里包装函数

Python 在哪里包装函数,python,wrapper,python-decorators,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) p

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

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

也就是说,为什么它会在定义函数之前出现?应该如何正确地构造包装?

如注释中所述,这解释了为什么在进行检查时会进行检查,但仍然无法完成您想要的操作。此检查仅检查包含
不允许\u main
的模块是否为
\u main\u
;如果调用代码是
\uuuuu main\uuuuu
,则不会。你需要一个更复杂的检查来完成你想要的


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

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

    return wrapper

请注意如何返回
包装器
,并在完成验证后调用
func

因为
如果uuuuuu name uuuuu=='uuuu main uuuu'
为真,并且在
echo
之前执行修饰函数?另请参阅:请拒绝接受我的答案。正如评论中所指出的,它只解决了问题的一半。它解释了为什么检查发生在您期望的时间以外的时间,但它仍然没有检查正确的事情。这实际上仍然不起作用-它检查的是包含此代码的模块的名称,而不是调用它的代码。我认为您需要检查的是
inspect.currentframe(1).f_globals['''u_________']
1
可能需要更高才能获得正确的堆栈帧)。这是真的;那太草率了。我会添加一个注释,我已经请求他们不接受,所以如果需要,我可以删除它。