用于许多不同项目的生成器



有一个由许多不同项(函数、对象属性、值(组成的数组,例如:

lst = [
1,
a(),
obj.prop,
...
z()
]

我想检查所有的值是否为True,所以我使用all():

all(lst)

但在这种情况下,列表的所有值都是在创建列表时计算的。

目的是不计算列表初始化中的所有值,而是"动态"计算它,并停止迭代(和计算(列表中的第一个False项。因此,一个解决方案是从生成器中产生每个值:

def gen():
yield 1
yield a()
yield obj.prop
...
yield z()

但它并不是干巴巴的代码,重复使用yield关键字看起来很难看。还有其他更漂亮的解决方案吗?

我会因为发布这篇文章而被否决,但如果你能将函数和参数拆分成一个元组列表(如果不是真正的函数,则params=None(,这样的方法就会奏效。但正如人们在评论中所说的那样,这些数据是丑陋的。在将这些函数添加到列表之前,请重新考虑它们的来源,并在可能的情况下,在生成列表之前尝试逐一评估它们。

def a(z):
print('a')
return True
def b(z):
print('b')
return False
def c(z):
print('c')
return True
def map_func_params(x):
for func, params in x:
if params is None:
if func:
continue
if func(*params):
continue
else:
return False
return True
print(
map_func_params([(a, (1,)), (b, (2, )), (c, (2, )), (4, None)])
)

打印显示:

a
b
False

并且从不执行函数c。

最新更新