代码之家  ›  专栏  ›  技术社区  ›  gerdemb

重构此python代码以在容器上迭代

  •  3
  • gerdemb  · 技术社区  · 16 年前

    当然有更好的方法吗?

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

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

    编辑: 我发现是我的代码把一个空查询集变成了“无”,而不是返回一个空列表。能够假设查询集总是可迭代的,通过允许删除“if”语句简化了代码。下面的答案可能对其他有相同问题的人有用,但不能修改他们的代码来保证查询集不是“无”。

    4 回复  |  直到 16 年前
        1
  •  19
  •   jfs    16 年前
    results = [(getattr(obj, field.attname), obj.pk) for obj in queryset or []]
    
        2
  •  8
  •   Hannes Ovrén    16 年前

    怎么样

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

    这与J.F塞巴斯蒂安的建议相同,只是没有作为清单理解来实现。

        3
  •  2
  •   Joe Holloway    16 年前

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

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

    参考文献:

        4
  •  1
  •   SilentGhost    16 年前

    你可以使用列表理解,但除此之外,我看不出你能改进什么。

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