如何将all()的元组参数改为生成器以实现条件逐个求值?
解决多条件依赖的
all()惰性求值问题 当然可以实现!你提到的元组写法之所以无法处理条件依赖,是因为元组会在创建时立即求值所有元素,不管all()是否需要用到后面的条件。而生成器表达式本身是惰性求值的,但如果直接把条件表达式放进元组/列表里传给生成器,还是会提前计算——所以关键是要让每个条件在all()迭代到它的时候才被计算。
最直接的方式是把每个条件包装成lambda表达式,然后用生成器表达式遍历并调用这些lambda:
import os some_file = "target.txt" if all(check() for check in ( lambda: os.path.exists(some_file), lambda: os.path.getsize(some_file) > 0, lambda: some_file.endswith(".txt"), # 继续添加你的43个条件... )): do_stuff()
这种写法的核心逻辑是:
- 每个lambda是一个延迟执行的条件,只有被调用时才会计算结果
- 生成器表达式
check() for check in (...)会逐个调用lambda,all()遇到第一个False就会停止迭代,后面的lambda根本不会被执行 - 完美解决了条件依赖的问题(比如文件不存在时,
os.path.getsize()永远不会被调用,避免报错)
对比元组写法,这种方式既保持了代码的整洁性,又实现了短路求值的特性,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

