2

コードフローを処理するために例外を使用するのは間違っています。getEntity(id) という名前のメソッドを持つコードで作業しており、エンティティが見つからない場合、getEntity は DoesNotExist 例外をスローします。entityExists(id) メソッドはありません。エンティティが存在するかどうかを確認するために、コードは通常次のことを行います。

try: 
   getEntity(id)
catch DoesNotExist as e:
   # entity does not exist

私にはこれがより良いと思われます:

if not entityExists(id):
   # entity does not exist

これは^常識ですか?コードは Django を使用しており、Django の例外名 (DoesNotExist) とエンティティの非存在を処理する通常の方法をコピーしているため、そのようなものだと思います。

質問は Python に固有のものではありませんが、例として使用しているコードは Python にあるため、質問に Python のタグを付けました。

4

2 に答える 2

8

これはEAFPまたは許可よりも許しを求める方が簡単として知られています。Python用語集から:

この一般的な Python コーディング スタイルは、有効なキーまたは属性が存在することを前提としており、その前提が偽であることが判明した場合に例外をキャッチします。このクリーンで速いスタイルは、多くのtryステートメントexceptの存在によって特徴付けられます。この手法は、などの他の多くの言語に共通するLBYLスタイルとは対照的です。

LBYLLook before you jump を意味します。再びThe Python Glossaryから:

このコーディング スタイルでは、呼び出しまたは検索を行う前に、事前条件を明示的にテストします。このスタイルは、EAFP アプローチとは対照的であり、多数の if ステートメントが存在するという特徴があります。

if not entityExists(id):次に、あなたの提案に対する良い反例を示します。

マルチスレッド環境では、LBYL アプローチは、「見ること」と「跳躍すること」の間で競合状態を引き起こす危険性があります。たとえば、if key in mapping: return mapping[key]別のスレッドがテスト後、ルックアップ前にマッピングからキーを削除すると、コードが失敗する可能性があります。この問題は、ロックまたは EAFP アプローチを使用して解決できます。

Python (または任意の言語) で書く場合、その言語のイディオムに従うと、他の人がコードを理解しやすくなります。

于 2013-05-08T22:28:10.297 に答える