Генератор для множества различных предметов - PullRequest
0 голосов
/ 28 февраля 2020

Существует множество различных элементов (функций, свойств объекта, значений), например:

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

 z()
]

Я хотел бы проверить, что все значения имеют значение True, поэтому я использую all() :

all(lst)

Но в этом случае все значения списка вычисляются на момент создания списка.

Цель состоит в том, чтобы не вычислять все значения при инициализации списка, но вычислить его «на лету» и прекратить итерацию (и вычислить) по первому ложному элементу в списке. Таким образом, одним из решений является получение каждого значения из генератора:

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

 yield z()

Но это не код dry и выглядит уродливо с повторяющимся ключевым словом yield. Есть ли другое, более красивое, решение?

1 Ответ

0 голосов
/ 28 февраля 2020

Я собираюсь опустить голос за публикацию этого, но если вы можете разделить функции и параметры в список кортежей (с 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 никогда не выполняется.

...