繁体   English   中英

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

[英]Duck typing and unhelpful error messages in Python

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

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

如果出于某种原因,bar包含foo没有的键,则将导致KeyError 假设用户与此模块进行交互的方式与foo或bar无关,但是已经传递了模块作者未预料到的某种参数,从而导致出现此错误。 作者没有检查输入并禁止这种输入类型/值,而是做了Python式的事情,并抛出了此错误。

我的问题是:似乎Python的鸭子输入可能导致无用的错误消息,例如在上述假设情况下。 有没有办法编写您的代码,使其引发更多有用的错误消息? 也许您可以基于类型检查/值引发警告?

在我看来,列表理解比语言问题更多的是限制,因为列表理解为简洁而牺牲了多功能性。 因此,不能在此类表达式的中间捕获异常。 只需手动进行迭代,就可以轻松重现更详细的错误或警告消息,而几乎没有性能或可读性的损失:

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))

并且由于编程语言显然支持此功能,因此这取决于模块作者。

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

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

做出这个答案,鸭没有受到伤害。 如果事实是事实,则完全没有参与。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM