2012-07-13 53 views
3

我是django的新手,想到做簡單的django應用程序來了解更多信息,在代碼中的一個地方,我不得不選擇locationName,並在表格中獲取與locationName相匹配的元素。當我開始想知道是continue逃避一個for循環最pythonic的方式?問題是否繼續Pythonic逃離try catch塊的方式?

代碼下面給出:

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

不能得到更多的Pythonic比使用關鍵字的方式更有意思。 – 2012-07-13 09:45:54

+0

您想從try'/'catch'塊('pass')或從當前循環迭代('continue')或從整個循環('break')? – user558061 2012-07-13 11:12:44

+0

@ user558061從整個循環轉義並轉到下一個迭代 – 2012-07-13 11:26:21

回答

8

如果有一些代碼,你不希望以後除了得到條款執行,continue是完全有效的,否則有些人可能會發現pass更適合。

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() 
+0

這是正確的答案(如果我們回答標題中的問題而不是描述中的問題)。 'continue'用於跳出當前的循環迭代,並從下一次迭代開始。如果你想逃離'try' /'except'塊,'pass'是正確的關鍵字,如果你沒有在'try'或'except'塊內做任何事情。 爲了回答你的(OP)問題,「是」繼續「Pythonic從try catch塊中退出的方式嗎?」,然後否,如果你沒有在塊中做任何事情,「pass」是正確的方法。 – user558061 2012-07-13 11:05:28

2

您應該使用

try: 
    element = location.objects.order_by('-id').filter(name__id=idRef)[0] 
except IndexError: 
    pass 
+1

假設在try/except塊之後有更多的代碼*。 – 2012-07-13 09:46:11

3

這正是continue/break關鍵字是,那麼是的,這是最簡單,最Python的方式正在做。

應該有一個 - 最好只有一個 - 明顯的方法來做到這一點。

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