18

KeyErrorの文字列表現でエラー メッセージに余分な引用符が追加されるのはなぜですか? 他のすべての組み込み例外は、エラー メッセージ文字列を直接返すだけです。

たとえば、次のコード:

print str(LookupError("foo"))
print str(KeyError("foo"))

次の出力が生成されます。

foo
'foo'

他の組み込み例外 ( IndexErrorRuntimeErrorExceptionなど) のサンプルでこれを試してみましたが、それらはすべて引用符なしで例外メッセージを返します。

help(KeyError)は、基本クラスで定義されたものを使用する とは対照的に、__str__(...)で定義されていると言います。これは、動作がどのように異なるかを説明していますが、でオーバーライドされる理由は説明していません。組み込み例外に関する Python のドキュメントでは、この不一致について何の説明もありません。KeyErrorLookupErrorBaseException __str__(...)KeyError

Python 2.6.6 に対してテスト済み

4

1 に答える 1

23

これは、KeyError('')正しく検出できるようにするためです。KeyError_str関数ソースから:

/* If args is a tuple of exactly one item, apply repr to args[0].
   This is done so that e.g. the exception raised by {}[''] prints
     KeyError: ''
   rather than the confusing
     KeyError
   alone.  The downside is that if KeyError is raised with an explanatory
   string, that string will be displayed in quotes.  Too bad.
   If args is anything else, use the default BaseException__str__().
*/

実際、 が空の文字列の場合、traceback印刷コードは例外値を出力しません。str(value)

于 2014-07-28T15:48:46.777 に答える