有没有更好的方法来做到以下几点:
try:
a.method1()
except AttributeError:
try:
a.method2()
except AttributeError:
try:
a.method3()
except AttributeError:
raise
Run Code Online (Sandbox Code Playgroud)
它看起来很讨厌,我宁愿不这样做:
if hasattr(a, 'method1'):
a.method1()
else if hasattr(a, 'method2'):
a.method2()
else if hasattr(a, 'method3'):
a.method3()
else:
raise AttributeError
Run Code Online (Sandbox Code Playgroud)
保持最高效率.
dbr*_*dbr 24
稍微改变第二个看起来很漂亮和简单.我真的怀疑你会注意到两者之间的任何性能差异,这比嵌套的try/excepts好一点
def something(a):
for methodname in ['method1', 'method2', 'method3']:
try:
m = getattr(a, methodname)
except AttributeError:
pass
else:
return m()
raise AttributeError
Run Code Online (Sandbox Code Playgroud)
另一种非常易读的方法是做..
def something(a):
try:
return a.method1()
except:
pass
try:
return a.method2()
except:
pass
try:
return a.method3()
except:
pass
raise AttributeError
Run Code Online (Sandbox Code Playgroud)
虽然很长,很明显函数正在做什么.性能真的不应该是一个问题(如果一些try/except语句明显减慢你的脚本,脚本结构可能有一个更大的问题)
Jas*_*ker 22
也许你可以尝试这样的事情:
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
Run Code Online (Sandbox Code Playgroud)
你会这样称呼它:
call_attrs(a, ['method1', 'method2', 'method3'])
Run Code Online (Sandbox Code Playgroud)
这将尝试按照它们在列表中的顺序调用方法.如果你想传递任何参数,你可以在列表之后传递它们,如下所示:
call_attrs(a, ['method1', 'method2', 'method3'], arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
method = (
getattr(a, 'method1', None) or
getattr(a, 'method2', None) or
getattr(a, 'method3')
)
method()
Run Code Online (Sandbox Code Playgroud)
method1然后method2,这将首先寻找method3.一找到其中一个,搜索就会停止.如果没有找到任何方法,则last getattr会引发异常.
| 归档时间: |
|
| 查看次数: |
30307 次 |
| 最近记录: |