有更优雅的方式来写这个吗?
try:
author = Author.objects.get \
(internal_id=line[5])
except:
author = Author.objects.get \
(internal_id=author_mapper[line[5]])
或者这是最好的吗?
答案 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。因此,如果常规查询有结果,则不会执行备用查询。