【问题标题】:Python lazy multiple conditions checkPython惰性多条件检查
【发布时间】:2018-02-03 16:29:40
【问题描述】:

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

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

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

如果条件的数量在增加,那么if 子句就会变得丑陋。

我可以列出条件 lambdas 并使用all 方法,但它看起来也很丑:

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

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

有没有更好的方法来缩短代码?还有其他方法可以使条件变得惰性吗?

【问题讨论】:

  • 你可以做if a == b == c == d:
  • 这似乎不是 python 问题,因为您声明问题是由于查询时间造成的。在这种情况下,python 代码没有区别;这是一个微优化。
  • 鉴于您的反对意见是您的解决方案“看起来很丑”,而您要求的解决方案“看起来更好”,这完全基于您的意见,您甚至希望如何回答?
  • @potykion 您的实际条件是什么样的?
  • 为什么要

标签: python lazy-evaluation


【解决方案1】:

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

all() will short-circuit,这意味着一旦条件评估为False,它将停止处理条件,从而为您节省运行其他查询所花费的时间。

至于什么看起来最好——这取决于你。但是拥有有效、可读的代码比“有吸引力”的代码要好得多!短代码并不总是更好。冗长通常会使代码对其他人更具可读性。

小心点。例如,如果后续条件依赖于第一个条件,则使用 all 可能会中断。例如,给定x='6.5'if isinstance(x, float) and x>5.5 可以工作,但all((isinstance(x, float), x>5.5)) 会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多