括弧なしの「raise exception()」と「raise exception」の違いはありますか?


99

パラメータなしの例外の定義:

class MyException(Exception):
    pass

発生した場合、次のような違いはありますか?

raise MyException

そして

raise MyException()

何も見つかりませんでした。それは単にオーバーロードされた構文ですか?



1
厳密に言えば、それは構文ではありません。Pythonは、実行時まで、クラスとインスタンスのどちらを取得するかを知ることができません。
asmeurer 2014

回答:


114

簡単に言えば、どちらも同じことraise MyExceptionraise MyException()行うということです。この最初のフォームは、例外を自動的にインスタンス化します。

ドキュメント関連セクションでは、「raiseは最初の式を例外オブジェクトとして評価します。これはサブクラスまたはBaseExceptionのインスタンスのいずれかである必要があります。クラスの場合、必要に応じてクラスをインスタンス化して例外インスタンスを取得します。引数なし。」

つまり、セマンティクスは同じですが、最初の形式は微視的に高速で、2番目の形式はより柔軟です(必要に応じて引数を渡すことができるため)。

ほとんどの人がPythonで(つまり、標準ライブラリ、一般的なアプリケーション、および多くの本で)使用する通常のスタイルraise MyExceptionは、引数がない場合に使用するスタイルです。引数を渡す必要がある場合にのみ、例外を直接インスタンス化します。次に例を示します raise KeyError(badkey)


18
最初の形式(括弧なし)が微視的に速いのはなぜですか?
jamesdlin

15
@jamesdlin自動インスタンス化するCコードには、自分で呼び出しを行うことによるオーバーヘッドよりも解釈のオーバーヘッドがないためです。
レイモンドヘッティンガー2018


0

はい、違いがあります ValueErrorありますValueError()

ValueError クラスですが ValueError()のインスタンスを作成します。これが理由であるtype(ValueError) is typetype(ValueError()) is ValueError

の唯一の目的 raise、例外を発生させることです、

私たちが使うとき ValueError、クラスが呼び出され、コンストラクタが実行されます ValueError()

を使用するValueError()場合、メソッドValueError()が直接呼び出されます。

注意: raise ValueError # shorthand for 'raise ValueError()'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.