更多Pythonic / Django-esque的方式来写这个?

时间:2010-12-07 20:43:56

标签: python django

有更优雅的方式来写这个吗?

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

或者这是最好的吗?

2 个答案:

答案 0 :(得分:5)

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) 

你的版本对爵士乐来说已经足够了。但是,您应该添加一个显式异常来捕获,因为空白except语句可能相当危险。想象一下使用internal_id=line[5]引发Author.MultipleItemsReturned的情况。你肯定希望这个提升,和/或单独处理它,因为它是一个可能被隐藏的非常不同的问题。好吧,在这种情况下,它可能不会,但一般来说,空白except并不好:)

答案 1 :(得分:1)

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]

一些注意事项:您应该能够保证这些内部ID是唯一的(由于您使用的是get方法,因此可以安全地假设)。只要第一个查询有结果,就不会执行备用查询。进一步改进可能是使方法返回查询和备用查询。然后你甚至不能创建一个查询实例(这些都相当便宜,但是如果你真的想要轻松干净......)

示例:

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

如果有人对正在发生的事情模糊不清,当“或”运算符(任何布尔运算符)操作两个查询时,它们将以短路方式执行和评估。如果查询结果,则查询评估为true,否则为false。因此,如果常规查询有结果,则不会执行备用查询。