5

我有兴趣了解以下行为背后的基本原理:

在红宝石中,

irb(main):003:0> dic = {:a => 1, :b => 2}
=> {:a=>1, :b=>2}
irb(main):004:0> dic[:c]
=> nil

在 Javascript 中:

> var dic = {a: 1, b: 2};
undefined
> dic['c']
undefined

Clojure:

user=> (def dic {:a 1 :b 2})
#'user/dic
user=> (:c dic)
nil

在 Python 中:

>>> dic = {'a': 1, 'b': 2}
>>> dic['c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'

我想知道为什么 Python 的(默认)行为是引发异常,而不是nil像上面列出的其他语言一样返回某种形式。我没有在设计常见问题解答中看到答案。(我想一个等效的问题是问为什么其他语言会做他们所做的事情,但 Python 在这方面似乎是个怪人。)

4

2 回答 2

6

来自 Python 之禅 ( import this):

 Errors should never pass silently.
 Unless explicitly silenced.

意思是,未找到的键被视为错误,除非您明确地为它编码,例如通过捕获KeyError或使用该dict.get(key, default)方法。

Python 被明确设计为在这方面和(大多数)其他方面非常明确。

于 2013-09-13T18:32:34.027 回答
3

EAFP(请求宽恕比许可更容易):

这种常见的 Python 编码风格假设存在有效的键属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多tryexcept陈述。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

于 2013-09-13T18:36:21.907 回答