当前位置:  开发笔记 > 编程语言 > 正文

python中的嵌套try语句?

如何解决《python中的嵌套try语句?》经验,为你挑选了3个好方法。

有没有更好的方法来做到以下几点:

try:
    a.method1()
except AttributeError:
    try:
        a.method2()
    except AttributeError:
        try:
            a.method3()
        except AttributeError:
            raise

它看起来很讨厌,我宁愿不这样做:

if hasattr(a, 'method1'):
    a.method1()
else if hasattr(a, 'method2'):
    a.method2()
else if hasattr(a, 'method3'):
    a.method3()
else:
    raise AttributeError

保持最高效率.



1> dbr..:

稍微改变第二个看起来很漂亮和简单.我真的怀疑你会注意到两者之间的任何性能差异,这比嵌套的try/excepts好一点

def something(a):
    for methodname in ['method1', 'method2', 'method3']:
        try:
            m = getattr(a, methodname)
        except AttributeError:
            pass
        else:
            return m()
    raise AttributeError

另一种非常易读的方法是做..

def something(a):
    try:
        return a.method1()
    except:
        pass

    try:
        return a.method2()
    except:
        pass

    try:
        return a.method3()
    except:
        pass

    raise AttributeError

虽然很长,很明显函数正在做什么.性能真的不应该是一个问题(如果一些try/except语句明显减慢你的脚本,脚本结构可能有一个更大的问题)



2> Jason Baker..:

也许你可以尝试这样的事情:

def call_attrs(obj, attrs_list, *args):
    for attr in attrs_list:
        if hasattr(obj, attr):
            bound_method = getattr(obj, attr)
            return bound_method(*args)

    raise AttributeError

你会这样称呼它:

call_attrs(a, ['method1', 'method2', 'method3'])

这将尝试按照它们在列表中的顺序调用方法.如果你想传递任何参数,你可以在列表之后传递它们,如下所示:

call_attrs(a, ['method1', 'method2', 'method3'], arg1, arg2)



3> Ethan Furman..:
method = (
        getattr(a, 'method1', None) or
        getattr(a, 'method2', None) or
        getattr(a, 'method3')
        )
method()

method1然后method2,这将首先寻找method3.一找到其中一个,搜索就会停止.如果没有找到任何方法,则last getattr会引发异常.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有