#python
#python
Вопрос:
Например. у меня есть генератор, и я хочу расширить каждую пару параметрами функций из словаря, если он доступен, иначе используйте Nones.
gen = ((k,v) for k, v in enumerate('abcde'))
def func(k, v, w x, y, z): pass
Я могу проверить, доступен ли каждый dict в качестве источника аргументов, и использовать предыдущий генератор для выполнения его пар со значениями dict или Nones:
dicts = ({}, None, {}, None)
extend_pairs = lambda get, gen: ((k, v, get(k)) for k, v in gen) if get else ((*p, None) for p in gen)
for d in (dicts):
# use extra function to pass each iteration variable instead of last one
get = extend_pairs(d and d.get, gen)
results = [func(*args) for args in gen]
Но еще проще было бы сначала проверить доступность всех словарей, а затем выполнить пары с динамически генерируемой функцией, которая возвращает все значения dict или Nones сразу.
sources = tuple(x.get if isinstance(x, dict) else None for x in dicts)
# then dynamically create function with exec to get args and it works just like below:
if any(sources):
get_args = lambda k, v: k, v, sources[0](k), None, sources[2](None) # ...
else:
get_args = None
results = [func(*get_args(*p) for p in gen] if get_args else [func(*p) for p in gen]
Это не то, что мне действительно нужно, просто личное любопытство. Когда это случай функции с аргументами только для ключевых слов, я мог бы использовать конвейерный словарь kwargs или даже список в приведенном выше случае, но как мне справиться с такой проблемой или есть лучший, более эффективный способ сделать это?
Комментарии:
1. Похоже, вам нужен zip или itertools.ziplongest docs.python.org/3/library/functions.html#zip . docs.python.org/3/library/itertools.html#itertools.zip_longest
2. @DyRuss да, это решение, но мне придется сохранить gen и создать каждый генератор параметров функции с дополнительным поиском, если словарь доступен, затем заархивируйте его. И мне интересно, можно ли избежать этого дополнительного поиска данных gen в каждом словаре.