为什么有些语言在键不在字典中时返回nil,而Python会抛出异常?

DJG*_*DJG 5 python programming-languages

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

在Ruby中,

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

在Javascript中:

> var dic = {a: 1, b: 2};
undefined
> dic['c']
undefined
Run Code Online (Sandbox Code Playgroud)

Clojure的:

user=> (def dic {:a 1 :b 2})
#'user/dic
user=> (:c dic)
nil
Run Code Online (Sandbox Code Playgroud)

在Python中:

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

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

Tho*_*mas 6

来自Python的Zen(import this):

 Errors should never pass silently.
 Unless explicitly silenced.
Run Code Online (Sandbox Code Playgroud)

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

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


Ash*_*ary 3

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

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