Python 惰性多条件检查
Python lazy multiple conditions check
我有很多条件要检查,但是条件评估很重(例如条件需要访问数据库),所以我不得不懒惰地检查它们。
一般情况下,这样的检查可以写在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
有没有更好的方法来缩短代码?还有其他方法可以使条件变得惰性吗?
你最好的选择是继续你正在做的事情——但是首先检查你最快的条件。
,这意味着一旦某个条件的计算结果为 False
,它将停止处理条件,从而节省您 运行 其他查询所花费的时间。
至于什么 看起来 最好 — 由您决定。但是拥有有效、可读的代码比 "attractive" 代码要好得多!短代码并不总是更好。冗长通常会使代码对其他人更易读。
小心一点。例如,如果后续条件依赖于第一个条件,则使用 all
可能会中断。例如,给定 x='6.5'
,if isinstance(x, float) and x>5.5
会工作,但 all((isinstance(x, float), x>5.5))
会出错。
我有很多条件要检查,但是条件评估很重(例如条件需要访问数据库),所以我不得不懒惰地检查它们。
一般情况下,这样的检查可以写在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
有没有更好的方法来缩短代码?还有其他方法可以使条件变得惰性吗?
你最好的选择是继续你正在做的事情——但是首先检查你最快的条件。
False
,它将停止处理条件,从而节省您 运行 其他查询所花费的时间。
至于什么 看起来 最好 — 由您决定。但是拥有有效、可读的代码比 "attractive" 代码要好得多!短代码并不总是更好。冗长通常会使代码对其他人更易读。
小心一点。例如,如果后续条件依赖于第一个条件,则使用 all
可能会中断。例如,给定 x='6.5'
,if isinstance(x, float) and x>5.5
会工作,但 all((isinstance(x, float), x>5.5))
会出错。