Понимание с переменным количеством аргументов? - PullRequest
3 голосов
/ 31 мая 2019

Можно ли программно строить понимания для обработки переменного количества аргументов, как в Haskell ?

Например, как расширить этот внешний продукт для словарей на более чем 2 словаря:

def outer(f,g):
    return lambda d1,d2: {f(k1,k2):g(v1,v2) for k1,v1 in d1.items() for k2,v2 in d2.items()}

Дано:

d1 = {'a':1, 'b':2}
d2 = {'a':10, 'b':11, 'c':12}

и эти вспомогательные функции, которые работают с переменными аргументами:

def string_join(*arg):
    return ''.join(tuple(arg))

def arg_sum(*arg):
    return sum(tuple(arg))

Тогда:

outer(string_join,arg_sum)(d1,d2)

{'aa': 11, 'ab': 12, 'ac': 13, 'ba': 12, 'bb': 13, 'bc': 14}

Можно ли распространить удобное понимание на переменную arg (d1, d2, d3 ...) или использовать для циклов?

1 Ответ

1 голос
/ 31 мая 2019

Язык не поддерживает это напрямую (поскольку поток управления одометром сильно отличается на уровне байт-кода), но он может быть реализован с itertools.product и расширенной * распаковкой:

def outer1(f,g,e):
  a,b=zip(*e)
  return f(*a),g(*b)
def outer(f,g):
  return lambda *dd: dict(outer1(f,g,e) for e in itertools.product(*(d.items() for x in dd)))
...