[英]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.