Рефакторинг этого кода Python для перебора контейнера - PullRequest
3 голосов
/ 30 января 2009

Конечно, есть лучший способ сделать это?

results = []
if not queryset is None:
    for obj in queryset:
        results.append((getattr(obj,field.attname),obj.pk))

Проблема в том, что иногда набор запросов имеет значение None, что вызывает исключение, когда я пытаюсь выполнить итерацию по нему. В этом случае я просто хочу, чтобы результат был установлен в пустой список. Этот код взят из представления Django, но я не думаю, что это имеет значение - это кажется более общим вопросом Python.

РЕДАКТИРОВАТЬ: Я выяснил, что именно мой код превращал пустой набор запросов в "None" вместо того, чтобы возвращать пустой список. Возможность предположить, что набор запросов всегда итеративен, упрощает код, позволяя удалить оператор «если». Приведенные ниже ответы могут быть полезны для тех, кто сталкивается с той же проблемой, но не может изменить свой код, чтобы гарантировать, что набор запросов не "Нет".

Ответы [ 4 ]

19 голосов
/ 30 января 2009
results = [(getattr(obj, field.attname), obj.pk) for obj in queryset or []]
8 голосов
/ 30 января 2009

Как насчет

for obj in (queryset or []):
    # Do your stuff

Это то же самое, что предложение Дж.Ф. Себастьяна, только не реализованное в виде списка.

2 голосов
/ 07 февраля 2009

Для чего бы то ни было, у менеджеров Django есть набор запросов none, который вы можете использовать, чтобы избежать бесполезной проверки None. Использование его для проверки отсутствия нулевого набора запросов может упростить ваш код.

if queryset is None:
    queryset = MyModel.objects.none()

Ссылки:

1 голос
/ 30 января 2009

вы можете использовать списки, но кроме этого я не вижу, что вы можете улучшить

result = []
 if queryset:
     result = [(getattr(obj, field.attname), obj.pk) for obj in queryset]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...