2017-05-17 1 views
1

traceback.format_exception_onlyには引数(etype, value)があります。私がフォーマットしたい例外がある場合、どのような状況でformat_exception_only(type(e), e)に電話したくないでしょうか?なぜPythonは例外タイプと値(exc_info、__exit__など)を分離するのですか?

sys.exc_infoは、型、値、およびトレースバックを返します。コンテキストマネージャのメソッド__exit__は、パラメータと同じ3つのものを持っています。タイプは重複していませんか?それはtype(value)以外のものと等しいことができますか?

答えて

3

歴史的な理由。

この情報は1.x日後に単一のオブジェクトにまとめられているわけではありません。例外タイプはクラスではなく文字列(!)でした。値は任意のオブジェクトであり、トレースバックはこれらのオブジェクトのいずれにも関連付けられていませんでした。すべてのtype, value, traceback APIは、これらのオブジェクトは、周りに個別に渡さなければならなかったこのデザイン、中心に構築された:

MyException = "MyException" 

raise MyException, 3 

、彼らはクラスベースの例外を追加1.xのライン(I think 1.2)でいくつかの時間、およびいくつかの時間で2.xの行(私は、2.5 branchのコードパスは警告を出すように見えるので、2.6と思う)、文字列の例外は取り除かれていたが、古い関数の署名が詰まっていた。

+0

「トレースバックはこれらのオブジェクトのいずれにも接続されていませんでした」というケースはまだありませんか? –

+1

@AlexHall:Python 3では、例外オブジェクトの '__traceback__'属性としてトレースバックが利用できます。 – user2357112

+0

ええ、それは分かりませんでした。 Python 2のドキュメントは、トレースバックを格納することによって作成されるサイクルが非効率的であることを警告します。新しい属性はPython 3の効率を傷つけるのか、それとも魔法ですか? –

4

Pythonは、文字列オブジェクトを例外として1.x日以内に返すために使用されていました。文字列には、Exceptionのインスタンスとは異なり、引数はありません。

文字列例外は1.5では廃止され、 2.0 2.6では削除されました。それ以来、それはちょうど下位互換性です、私は思います。急激な変化を命令するのに十分な問題はありません。

+1

Python 3は変更を破棄するための時間とされていました。 –

+1

@ MarkRansom:_some_改ざんの変更ではなく、 "すべてのものを壊す"変更。それはそれがなくても非常に遅い受け入れ曲線を持つために十分なものを壊しました。トレースバックアクセス用の低レベルAPIは、フレームワーク、デバッガ、プロファイラなどの開発者が主に使用することはほとんどありません。ブレークすると、しばらくの間、非常に重要なツールでなくても初期のPython 3を残すことができます。それはおそらく価値のないものでした。 – 9000

+1

2.0にはまだ文字列例外がありました。私は彼らが2.6で完全に削除されただけだと思う​​。 [2.5ブランチ](https://github.com/python/cpython/blob/2.5/Python/ceval.c#L3105)は 'raise'実装で' DeprecationWarning'を使ってそれらの処理を引き続き行います。 – user2357112

関連する問題