5

私はPythonで十分なトレーニングを受けていないため、正しいやり方がわからないことがあります。これらのことの 1 つは、resultQuery が結果を返したかどうかをテストすることです。私はこれをたくさんやっていることに気づきます:

    try:
        user = User.objects.get(email=email)
    except DoesNotExist:
        user = User()

Python についてはわかりませんが、他の言語での try catch は、通常のプログラム フローではなく、例外用であると想定されています。if else でこれを行うにはどうすればよいでしょうか。私は次のようなものが欲しいと思います:

if request.GET.get('email','') is not None:
    email = request.GET['email'])
4

4 に答える 4

4

あなたの例外の例は、最も一般的に好ましい方法です。ウィキペディアには、これについて非常に優れた説明があります。

Python スタイルでは、エラー状態が発生する可能性がある場合は常に例外を使用する必要があります。実際に使用する前にファイルまたはリソースへのアクセスをテストするのではなく、Python では、アクセスが拒否された場合に例外をキャッチして、先に進んで使用を試みるのが一般的です。

例外は、if ブロック (...) の代替としてよく使用されます。一般的に呼び出されるモットーは、EAFP、または「許可よりも許しを求める方が簡単です」です。

Python では、例外は必ずしもコストがかかるわけではありません。繰り返しますが、ウィキペディアの例を引用します。

if hasattr(spam, 'eggs'):
    ham = spam.eggs
else:
    handle_error()

... 対:

try:
    ham = spam.eggs
except AttributeError:
    handle_error()

パフォーマンスの違いはありますが、これら 2 つのコード サンプルの効果は同じです。スパムに卵の属性がある場合、EAFP サンプルはより高速に実行されます。スパムに卵の属性がない場合 (「例外的な」ケース)、EAFP サンプルの実行は遅くなります。

特に Django の場合、例外の例を使用します。それはそのフレームワークで物事を行うための標準的な方法であり、標準に従うことは決して悪いことではありません:)。

于 2013-09-07T18:28:33.343 に答える
0

.filter()の代わりに.get()使用でき、django の最適化されたクエリセット評価も利用できます。

できるよ

qs = User.objects.filter(email=email)
if qs :
    user = qs[0]
...
于 2013-09-07T18:28:00.987 に答える
0

Django は、厳密なテストが必要EmptyQuerySetな場合に特別な実装に使用できるクラスを定義しています。isinstance(...)

簡単な方法は次のとおりです。

try:
    user = User.objects.get(email=email)
    if  user:
        # ...
    else:
        # ...

except DoesNotExist:
    user = User()

Django は、get単一の Model インスタンスを直接取得するメソッドを提供するか、例外を発生させます。この場合、通常の方法は、次のような例外をチェックすることですDoesNotExist

通常どおりデータベース クエリから行全体を取得するには、user.objects.filter(...)メソッドを使用します。返されたQuerySetインスタンスは.count().exists()メソッドを提供します。

于 2013-09-07T18:39:58.853 に答える
0

ここでは、例外をキャッチするのが通常のパターンであることに同意します。クエリセットが結果を返すかどうかを確認する必要がある場合、existsメソッドはその方法の 1 つであり、まだ言及されていないと思います。ドキュメントは、さまざまなパフォーマンスへの影響を実行します。特に、クエリセットが評価されることがわかっている場合は、クエリセットのブール解釈を確認することをお勧めします。

于 2013-09-07T18:41:23.983 に答える