有沒有更優雅的寫法呢?更多Pythonic/Django-esque的方式來寫這個?
try:
author = Author.objects.get \
(internal_id=line[5])
except:
author = Author.objects.get \
(internal_id=author_mapper[line[5]])
或者這是最好的嗎?
有沒有更優雅的寫法呢?更多Pythonic/Django-esque的方式來寫這個?
try:
author = Author.objects.get \
(internal_id=line[5])
except:
author = Author.objects.get \
(internal_id=author_mapper[line[5]])
或者這是最好的嗎?
author_id = line[5]
try:
author = Author.objects.get(internal_id=author_id)
except Author.DoesNotExist: #blank excepts are bad and hide errors.
author_id = author_mapper[line[5]]
author = Author.objects.get(internal_id=author_id)
您的版本足夠適合爵士樂。但是,您應該添加一個明確的例外來捕捉,因爲空白語句可能相當危險。想象一下,使用internal_id=line[5]
提高Author.MultipleItemsReturned
的情況。你肯定希望這個提高,和/或分開處理,因爲這是一個可能被隱藏的非常不同的問題。好了,在這種情況下,probabaly不會有,但只是一般,空白except
s爲並不好:)
IMO,這種讀取更好:
author_id = line[3]
alternate_id = author_mapper[author_id]
query = Author.filter(internal_id = author_id)
alternate_query = Author.filter(internal_id = alternate_id)
query = query or alternate_query
author = query[0]
一些注意事項:你應該能夠保證這些內部id是唯一的(因爲您使用get方法,所以這是安全的)。只要第一個查詢有結果,備用查詢就不會執行。進一步的改進可能是使方法返回查詢和備用查詢。然後,您可以連做一個查詢實例(這是相當便宜的,但如果你真的找光,清潔......)
例子:
author_id = line[5]
query = RegularQuery(author_id) or AlternateQuery(author_id, author_mapper)
author = query[0]
如果有人有什麼霧當兩個查詢由「或」運算符(任何布爾運算符)操作時,它們將以短路方式執行和評估。如果查詢結果爲查詢,則查詢爲真,否則爲假。因此,如果常規查詢有結果,則替代查詢將不會執行。
很好的建議,謝謝:) – AP257 2010-12-07 21:11:28