重构此Python代码以迭代容器

时间:2009-01-30 12:02:34

标签: python django refactoring iterator

当然有更好的方法吗?

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

问题是有时queryset是None,当我尝试迭代它时会导致异常。在这种情况下,我只想将结果设置为空列表。这段代码来自Django视图,但我认为不重要 - 这似乎是一个更普遍的Python问题。

编辑:我发现我的代码是将空的查询集转换为“无”而不是返回空列表。能够假设查询集始终是可迭代的,通过允许删除“if”语句来简化代码。下面的答案可能对有相同问题的其他人有用,但无法修改其代码以保证查询集不是“无”。

4 个答案:

答案 0 :(得分:19)

results = [(getattr(obj, field.attname), obj.pk) for obj in queryset or []]

答案 1 :(得分:8)

怎么样

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

这与J.F Sebastians的建议相同,只是没有作为列表理解实现。

答案 2 :(得分:2)

对于它的价值,Django经理有一个“无”的查询集,你可以使用它来避免无偿的无检查。使用它来确保您没有空的查询集可能会简化您的代码。

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

参考文献:

答案 3 :(得分:1)

你可以使用列表推导,但除此之外我看不到你可以改进的内容

result = []
 if queryset:
     result = [(getattr(obj, field.attname), obj.pk) for obj in queryset]