Более Pythonic / Django-esque способ написать это? - PullRequest
1 голос
/ 07 декабря 2010

Есть ли более элегантный способ написать это?

    try: 
        author = Author.objects.get \
                      (internal_id=line[5])
    except: 
        author = Author.objects.get \
                      (internal_id=author_mapper[line[5]]) 

Или это лучшее, что есть?

Ответы [ 2 ]

5 голосов
/ 07 декабря 2010
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) 

Ваша версия была достаточно хороша для джаза. Тем не менее, вы должны добавить явное исключение для catch, так как пустое выражение except может быть довольно опасным. Представьте себе ситуацию, когда использование internal_id=line[5] повышает Author.MultipleItemsReturned. Вы определенно хотите, чтобы это поднялось и / или имело дело с этим отдельно, так как это совсем другая проблема, которая могла бы быть скрыта. Хорошо, в этом случае это, вероятно, не было бы, но в целом, пустые except s не хороши:)

1 голос
/ 08 декабря 2010

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]

Некоторые примечания: вы должны быть в состоянии гарантировать, что эти внутренние идентификаторы уникальны (это можно предположить, так как вы используете метод get).Альтернативный запрос не будет выполнен, пока первый запрос имеет результаты.Дальнейшее улучшение может заключаться в том, чтобы метод возвращал запрос и альтернативный запрос.Тогда вы даже не сможете создать экземпляр запроса (это довольно дешево, но если вы действительно ищете легкий и чистый ...)

Пример:

author_id = line[5]
query = RegularQuery(author_id) or AlternateQuery(author_id, author_mapper)
author = query[0]

На всякий случайнеясен, что происходит, когда оператор «или» обрабатывает два запроса (любой логический оператор в этом отношении), они выполняются и оцениваются в режиме короткого замыкания.Запросы оцениваются как true, если они имеют результаты, и false, если нет.Таким образом, если обычный запрос имеет результаты, альтернативный запрос не будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...