Django/Python代码:可读与快速代码

Jam*_*Lin 2 python django

假设我想获得一个与值匹配的记录,我有两种方法可以做到:

第一:

try:
  obj = Model.objects.get(field = value)
except
  pass
Run Code Online (Sandbox Code Playgroud)

第二:

if Model.objects.filter(field = value).count() > 0:
  obj = Model.objects.filter(field_value)[0]
Run Code Online (Sandbox Code Playgroud)

让我们把代码注释放在一边,我应该使用哪种方式或者您更喜欢阅读哪种方式?第一个看起来更快,因为只有1个DB查找,但第二个方式似乎更具可读性,但需要2个DB查找.

And*_*ter 11

第一个是Python中的首选,基于EAFP设计原则("更容易请求宽恕而不是权限").除了速度之外,这个系统的一个优点是没有竞争条件 - 在第二个例子中,如果对数据库的其他并发访问改变了第一行和第二行代码执行之间的结果,那么你的结果将是不一致.

根据您对事务的使用,竞争条件的可能性可能不是问题,但一般来说EAFP是Python中的一个突出的设计模式,经验丰富的Python编码器在阅读该形式的代码时不会有任何问题.

ETA:哦,我忘记了:不要使用except:(你确实需要结肠).使用except IndexError:或您正在寻找的任何其他特定例外.这样,如果您遇到完全意外的错误,例如无法访问数据库,它将传播通过而不会被隐藏.您不希望以后出现以下情况:在抛出的异常中写入代码计数表示"没有结果",而系统正试图告诉您"数据库已关闭".