Pythonic方式分配默认值

Yuv*_*dam 15 python error-handling

考虑这一行:

some_value = lst.attr[idx]
Run Code Online (Sandbox Code Playgroud)

这里有两个可能的错误,attr可能不存在,并且idx可能超出范围.

是否有任何优雅的方法来减少这种说法?理想情况下,对于这样的事情:

some_value = lst.attr[idx] or default_value
Run Code Online (Sandbox Code Playgroud)

(不要在家里尝试.只适用于评估为某种东西的正确定义的表达式.)

当然,我可以这样做:

try:
    some_value = lst.attr[idx]
except:
    some_value = default_value
Run Code Online (Sandbox Code Playgroud)

但是,如果我在作业的背景下怎么办?例如:

print [x.attr[idx] for x in y]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,处理错误和分配默认值的pythonic方法是什么?

And*_*son 6

你需要在这里决定你想要达到的目标.使用"错误"一词可能会产生误导.

如果您实际上正在尝试处理将错误类型的对象传递给您的函数的情况,那么您不希望处理它并且应该引发异常.

如果您尝试允许在一系列不同类型上使用您的函数,那么这不是真正的错误,并且使用默认值可能是合理的.

最简单的选择是先测试属性是否存在.例如:

if hasattr(lst, "attr"):
    attr = lst.attr
else:
    attr = {}
Run Code Online (Sandbox Code Playgroud)

我假设它lst.attr是一个字典,在这种情况下你可以像这样处理默认值:

lst.attr.get(idx, default_value)
Run Code Online (Sandbox Code Playgroud)

永远不要使用try/ except语句,而不指定要捕获的异常.你最终可能会比你想要的更多地掩盖.

使用最后一段代码,我认为你不应该尝试在一行中解决它.可读性很重要.我不开心与下面的代码,但它如果得到改善x,yattr有更多的描述性的名称所取代.

attrs = [(x.attr if hasattr(x) else {}) for x in y]

print [attr.get(idx, default_value) for attr in attrs]
Run Code Online (Sandbox Code Playgroud)