如何简化重复的 try- except 块

LaB*_*aux 0 python lookup error-handling try-except

我有下面的代码需要检查是否找到任何对象的可见属性。try- except 块中的每个首字母缩略词函数如果找到则返回一个对象引用,每个都有自己的visible属性。如果未找到任何首字母缩略词对象,我的程序将因调用(例如)DR() 而引发 LookUpError。我觉得必须有一种方法来简化这段代码,这样我就不必指定所有这些单独的 try- except 块,但我无法考虑如何有效地做到这一点。

    def detect_planning_workflow_page():
        
        workflow = None
        
        try:
            if DR().visible:
                workflow = "DR"
        except LookupError:
            pass
        
        try:
            if LL().visible:
                workflow = "LL"
        except LookupError:
            pass
        
        try:
            if AZ().visible:
                workflow = "AZ"
        except LookupError:
            pass
        
        try:
            if SP().visible:
                workflow = "SP"
        except LookupError:
            pass
        
        try:
            if MS().visible:
                workflow = "Define Region"
        except LookupError:
            pass
        
        return workflow

Run Code Online (Sandbox Code Playgroud)

Sam*_*ord 6

我会使用循环来写这个:

    def detect_planning_workflow_page():
        for func, workflow in [
            (MS, "Define Region"),
            (SP, "SP"),
            (AZ, "AZ"),
            (LL, "LL"),
            (DR, "DR"),
        ]:
            try:
                if func().visible:
                    return workflow
            except LookupError:
                pass
        return None
Run Code Online (Sandbox Code Playgroud)

请注意,我颠倒了原始代码的顺序,因为workflow如果多次检查成功,原始代码将继续覆盖,因此最后一个将优先 - 交换顺序并立即返回应该具有相同的效果(除非调用func()其他代码有一个重要的副作用,从您的描述中并不明显)。