2

Python ディクショナリの設定されていないプロパティにアクセスするときKeyErrorに、返す代わりにスローする理由と意味は何ですか?None

言語設計にはトレードオフが伴うことを私は知っています。その中には実際的な懸念に基づくものもあれば、主に哲学に基づくものもあります。コンピューター サイエンスの観点から、なぜ Python はこのように設計されたのでしょうか?

質問を構成するためのいくつかのメモ

  • 私は主に、これが実際的な決定であったか (つまり、単に を返すだけでなく、エラーから回復するためのより多くのオプションを開発者に与えるNone)、またはその選択が哲学的なものだったか (つまり、「設定されていないプロパティへのアクセスは、Guido の意見、例外的なケース」)。
  • Python のdict.get関数にはこの機能がありますが、リテラル表記は、プログラムが設定されていない値を例外と見なす場合に最適化されているようです。
  • 例外処理は、メイン プログラムとは異なる制御フローを伴うため、推論が困難であると考えられていることは注目に値します。
  • Python が例外を発生させる代わりに戻った場合でも、unset と値を別の方法Noneで処理したい場合、プログラムはその値にアクセスする前にキーの存在をチェックできます。Noneしかし、例外プログラミング フローにアクセスできないので、何を失う可能性があるのか​​知りたいです。
4

3 に答える 3

4

それはPythonの設計哲学から来ています:

  • エラーが致命的であってはなりません。つまり、仮想マシンがまだ機能している限り、ユーザー コードはエラー状態から回復できる必要があります。
  • 同時に、エラーが黙って渡されるべきではありません (これらの最後の 2 つの項目により、当然、実装全体で例外を使用する決定が下されました)。

また、大声で叫ぶことを好まない言語が壊れているという古典的なケースがあります:Noneは必ずしもキーがないことを意味するわけではありません (これはメッセージが壊れていることを意味します)、オプションであってもキーが設定されていないことを意味する場合があります (これは問題ありません)。JSONを例にとります:

>>> j = json.loads('{ "key": null }')
>>> j['key']
>>> j['nokey']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'nokey'

-by-default を使用Noneすると、この例はより不格好になります。たとえば、PHP を考えてみましょう。

json_decodenull は、JSON がデコードするための完全に有効なオブジェクトでもありますが、無効な入力に対して null を返します。この関数はjson_last_error、使用するたびに呼び出さない限り、まったく信頼できません。

PHPから: 悪い設計のフラクタル

于 2015-05-12T23:41:18.357 に答える
1

Aは任意の値 ( を含む) をdict格納できるため、欠落しているキーと適切なセンチネルと思われるものにマップされているキーを (構文を使用して) 区別する唯一の方法は、例外を発生させることです。None[]

>>> d = {'foo': None}
>>> print d['foo']
None
>>> print d['bar']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'bar'

区別を気にしない場合は、get代わりにメソッドを使用できます。このメソッドは、None存在しないキーに対して意図的に (または選択したセンチネルを) 返します。

>>> print d.get('bar')
None
>>> print d.get('bar', 7)
7
于 2015-05-12T23:49:09.143 に答える
0

まず、用語を確認しましょう。

...Python 辞書の設定されていないプロパティにアクセスするとき

プロパティにアクセスしていません。キーを取得しています。と呼ばれるのはそのためKeyErrorです。プロパティは属性の特殊なケースであるため、AttributeError代わりに発生します

その理由については、感謝すべき型理論があります。d(たとえば)文字列をキーとして、整数を値として持つ辞書があります。すべて のについてk、このルールは実際に保持する必要があります。

assert isinstance(d[k], int)

を返すNoneと、ルールは失敗します。例外を発生させることは、操作の事後条件を満たせないことを示す通常の方法です。この場合、式がまだ評価されている間に例外が発生するため、アサーションは起動する機会がありません。

于 2015-05-12T23:31:28.227 に答える