【问题标题】:How to short-circuit a function using Python decorators?如何使用 Python 装饰器短路函数?
【发布时间】:2019-02-12 19:04:39
【问题描述】:

假设我有一个函数 F,它可能返回布尔值 false。如果我有一个名为 main() 的调用者会在多个地方调用 F,我是否可以将一个装饰器附加到 F 以传播返回值并导致其父 (main) 也提前退出?

【问题讨论】:

    标签: python python-3.x decorator python-decorators


    【解决方案1】:

    没有函数可以“返回”到高于其调用者的上下文。这(据我所知)在大多数编程语言中都是通用的。您可能可以通过检查 python 状态和调用堆栈来破解它,但更好/更合适的解决方案是将 main 包装在 try: except: 块中,该块捕获您在此装饰器中引发的自定义异常,具体取决于 @ 的输出987654322@

    import random
    from functools import wraps
    
    class ShortCircuit(Exception):
        pass
    
    def short_circuit(f):
        @wraps(f)
        def wrapped(*args, **kwargs):
            res = f(*args, **kwargs)
            if not res:
                raise ShortCircuit()
            else:
                return res
        return wrapped
    
    @short_circuit
    def F():
        return random.choice([True, False])
    
    def main():
        print(F())
        print(F())
    
    if __name__=="__main__":
        try:
            main()
        except ShortCircuit:
            print("short circuited")
    

    【讨论】:

    • 这就是我一直在寻找的——一些我不必每次调用 f 的解决方案 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2011-12-20
    • 2023-02-08
    • 2014-07-21
    • 1970-01-01
    • 2013-01-20
    • 2020-05-31
    相关资源
    最近更新 更多