Python 许多不同项目的发电机

Python 许多不同项目的发电机,python,generator,dry,yield,Python,Generator,Dry,Yield,有许多不同项目(函数、对象属性、值)的数组,例如: lst = [ 1, a(), obj.prop, ... z() ] 我想检查所有值是否为真,因此我使用all(): 但在这种情况下,列表的所有值都是在创建列表时计算的 其目的不是计算列表初始化时的所有值,而是“动态”计算,并停止迭代(和计算)列表中的第一个错误项。因此,一个解决方案是从生成器中产生每个值: def gen(): yield 1 yield a() yield obj.prop ... yield z

有许多不同项目(函数、对象属性、值)的数组,例如:

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

 z()
]
我想检查所有值是否为真,因此我使用
all()

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

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

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

 yield z()

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

我会被否决发表这篇文章,但如果你能将函数和参数拆分成一个元组列表(如果函数不是真正的函数,则参数=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永远不会执行。

代码很难看,因为“各种项目的数组”从一开始就很难看,您只在每行添加了
yield
关键字。如果定义此列表的最佳方法是按您所示逐字写出每个元素,那么答案是否定的:没有比将其作为生成器编写更漂亮的方法,可以支持您在发现第一个false后停止计算元素的要求(这是
all
为您所做的),它处理函数,但不处理变量,与
obj.prop
-可以使用
getattr
重写对象属性一样,简单变量需要一个包装函数:
def get_a():返回一个
不仅函数调用,而且对象属性也可能导致计算时执行任意代码
a
b
False