4

私はdjangoを初めて使用し、単純なdjangoアプリケーションでそれについてもっと学ぶことを考えました。コード内の1つの場所で、テーブルlocationNameと同じIDに一致する要素を選択して取得する必要がありました。for ループをエスケープする最も Pythonic な方法locationNameは何だろうと思い始めたときは?continue

問題のコードを以下に示します。

for locationName in locationGroup:
    idRef = locationName.id
    try:
        element = location.objects.order_by('-id').filter(name__id=idRef)[0]
    except IndexError:
        continue
4

4 に答える 4

9

If there's some code you don't want getting executed after the except clause, continue is perfectly valid, otherwise some might find pass more suitable.

for x in range(y):
    try:
        do_something()
    except SomeException:
        continue
    # The following line will not get executed for the current x value if a SomeException is raised
    do_another_thing() 

for x in range(y):
    try:
        do_something()
    except SomeException:
        pass
    # The following line will get executed regardless of whether SomeException is thrown or not
    do_another_thing() 
于 2012-07-13T10:27:59.683 に答える
3

それがまさにcontinue/breakキーワードの目的です。そうです、これが最も単純で最も Pythonic な方法です。

それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。

于 2012-07-13T10:05:39.187 に答える
2

使用する必要があります

try:
    element = location.objects.order_by('-id').filter(name__id=idRef)[0]
except IndexError:
    pass
于 2012-07-13T09:45:37.187 に答える
1

自分が何をしているのかを伝えるのが少し難しくなります。このコードは、最初の要素を調べて IndexError をキャッチすることにより、クエリから行を取得したかどうかを単純にチェックします。

この意図をより明確にする方法でそれを書きます:

for locationName in locationGroup:
    idRef = locationName.id
    rows = location.objects.order_by('-id').filter(name__id=idRef)
    if rows: # if we have rows do stuff otherwise continue
         element = rows[0]
         ...

この場合、これを使用getすると、さらに明確になります。

for locationName in locationGroup:
    idRef = locationName.id
    try:
         element = location.objects.get(name__id=idRef)
    except location.DoesNotExist:
         pass
于 2012-07-13T10:41:22.310 に答える