在Python中输入鸭子和无用的错误消息

时间:2014-08-08 01:44:35

标签: python duck-typing

考虑以下代码,它嵌入在某个模块的深处(foo和bar是dicts)。

vals = [foo[key] for key in bar.keys()]

如果由于某种原因bar包含foo没有的键,这将导致KeyError。假设用户与此模块交互的方式与foo或bar无关,但是已经通过某种类型的参数,模块作者没有预见到会引发此​​错误。作者没有检查输入并禁止输入的这种类型/值,而是做了Pythonic的事情并且抛出了这个错误。

我的问题是:似乎Python的鸭子打字会导致无用的错误消息,例如上面这个假设的情况。有没有办法编写您的代码,以便它抛出更多有用的错误消息?也许你可以根据类型检查/值抛出警告?

2 个答案:

答案 0 :(得分:2)

在我看来,这更像是对列表理解的限制,而不是语言问题,因为列表推导牺牲了简洁性的多样性;因此,在这种表达的中间不能捕获异常。只需手动迭代即可轻松复制更详细的错误或警告消息,几乎没有性能或可读性损失:

vals = []
for k in bar.keys():
    # This uses the EAFP paradigm. An alternative is to check for
    # dictionary membership first
    try:
        vals.append(foo[k])
    except KeyError:
        raise SuperUsefulException(str(k))

由于编程语言明确支持这一点,因此这取决于模块作者。

答案 1 :(得分:0)

说实话,正确的做法取决于模块的合同。它应该在这种情况下抛出错误吗?它应该默默地忽略这个条件吗?

不幸的是,通常没有指定合同行为。中间层调用者应该做出决定:在这种情况下的错误处理是为了返回有用的错误消息,因为顶级调用者不知道for和bar。

在回答这个问题时,没有鸭子受到伤害。事实上,根本没有参与。