Python懒惰多条件检查

时间:2018-02-03 16:29:41

标签: python lazy-evaluation

我有很多条件要检查,但条件评估很重(例如条件需要数据库访问),所以我必须懒得检查它们。

通常,这种检查可以写在if子句中:

if type in FOOD_PRIZES and Prize.objects.filter(type=type).exists():
    pass

如果条件数量增加,则if子句变得难看。

我可以制作条件lambda的列表并使用all方法,但它看起来也很难看:

conditions = [
  lambda: type in FOOD_PRIZES,
  lambda: Prize.objects.filter(type=type).exists()
] 

if all(condition() for condition in conditions):
   pass

是否有更好的方法可以缩短代码?还有其他方法让条件变得懒惰吗?

1 个答案:

答案 0 :(得分:0)

你最好的选择是继续你正在做的事情 - 但是要把你最快的条件放在首先检查。

all() will short-circuit,意味着一旦条件评估为$theEntityId = YOUR ENTITY ID; $entity = $em->find('User', $theEntityId); $expectedVersion = entity->version; try { // assert version $em->lock($entity, LockMode::OPTIMISTIC, $expectedVersion); // do the work $em->flush(); } catch(OptimisticLockException $e) { echo "Sorry, but someone else has already changed this entity. Please apply the changes again!"; } ,它就会停止处理条件,从而节省您通过运行其他查询所花费的时间。

至于什么看起来最好 - 这取决于你。但是,拥有有效,可读的代码比使用有吸引力的代码要好得多。码!短代码并不总是更好。详细程度通常会使代码对其他人更具可读性。

小心点。例如,如果后续条件取决于第一个条件,则使用False可能会中断。例如,给定allx='6.5'可行,但if isinstance(x, float) and x>5.5会出错。