Python中简洁的getattr()及其非None使用方法

52 投票
7 回答
45498 浏览
提问于 2025-04-15 20:19

我发现自己经常在做以下事情:

attr = getattr(obj, 'attr', None)
if attr is not None:
    attr()
    # Do something, either attr(), or func(attr), or whatever
else:
    # Do something else

有没有更符合Python风格的写法呢?这样写会更好吗?(我觉得在性能上至少没有提升。)

try:
    obj.attr() # or whatever
except AttributeError:
    # Do something else

7 个回答

14

还有一个不错的说法:

if hasattr(obj, 'attr'):
    ...something...
else:
    ...something else...

在你提供的两个选项中,我更喜欢第一个。因为在访问成员时抛出异常,这种做法感觉并不是异常设计的初衷。

32

和乔的回答类似,不过更简短:

getattr(obj, 'attr', lambda: None)()
56

因为你在调用 attr 这个函数,所以你可以直接这样做:

def default_action():
    # do something else

action = getattr(obj, 'attr', default_action)

action()

撰写回答