我有很多条件要检查,但条件评估很重(例如条件需要数据库访问),所以我必须懒得检查它们。
通常,这种检查可以写在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
是否有更好的方法可以缩短代码?还有其他方法让条件变得懒惰吗?
答案 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
可能会中断。例如,给定all
,x='6.5'
可行,但if isinstance(x, float) and x>5.5
会出错。