重构这个Python代码来遍历容器

问题描述:

当然有更好的方法来做到这一点?重构这个Python代码来遍历容器

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

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

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

+0

没有什么可这个被改进 - 如图所示。如果你可以解释为什么“有时”queryset是None,那么也许我们可以帮忙。 – 2009-01-30 12:05:20

+0

最后一行有错字吗? append需要一个参数,并且关闭和开放括号的数量不相互对应。 – SilentGhost 2009-01-30 12:07:56

+0

是的,修正了错字。查询集是从数据库搜索中设置的,如果没有结果,它似乎被设置为无。 – user27478 2009-01-30 12:12:29

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

你可以使用列表解析,但除此之外,我不认为你可以改进的地方

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

它如何

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

相同JF塞巴斯蒂安建议,只是没有作为列表理解来实现。

对于什么是值得的,Django管理器有一个“none”查询集,您可以使用它来避免无谓的未检查。使用它来确保你没有空的查询集可能会简化你的代码。

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

参考文献: