我想这不是关于鸭子类型的本质的问题,而是关于保持pythonic的问题。
首先-当处理字典时,尤其是当字典的结构是相当可预测的并且给定的密钥通常不存在但有时存在时,我首先想到两种方法:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
当然,Ye Olde的“宽恕与许可”方法。
try:
do_some_work(dict[myKey])
except KeyError:
pass
作为一名Python的熟练手,我觉得后者是很多人的首选,我觉得这很奇怪,因为在Python文档中try/excepts
,当出现实际错误时,似乎是首选,而不是…… 没有成功?
如果偶然的dict在myDict中没有密钥,并且已知它并不总是具有该密钥,那么try / except在上下文上是否会引起误解?这不是编程错误,只是数据的事实-该字典没有特定的键。
当您查看try / except / else语法时,这似乎特别重要,当确保try不会捕获太多错误时,这似乎非常有用。您可以执行以下操作:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
这是否会导致吞没可能是某些错误代码导致的各种奇怪错误?上面的代码可能只是在阻止您看到您要添加的内容,2 + {}
并且您可能永远都不会意识到代码的某些部分出现了严重错误。我不建议我们检查所有类型,这就是为什么它是Python而不是JavaScript的原因-但是在try / except的上下文中,似乎应该捕获程序正在执行的本来应该做的事情,而不是使它能够继续下去。
我意识到上面的例子是一个草率的论点,实际上是故意的。但是,鉴于better to ask forgiveness than permission
我的Python信条,我不禁要问一个问题,那就是在if / else与try / except正确应用之间,实际上是在沙子上的线在哪里,特别是当您知道期望的结果时您正在使用的数据。
我什至没有在谈论速度问题或最佳实践,我只是对感知的维恩图感到困惑,在这种情况下,维恩图看起来可能会发生任何一种变化,但是人们会在尝试/例外方面犯错因为“某处有人说这是Pythonic”。我对这种语法的应用是否得出了错误的结论?