Ответ 1
Взяв цитату из поток списка рассылки Py-Dev, в котором эта функция была принята:
Итак, это оставляет понимание. IIRC, во время разработки патча мы поняли, что
f(*x for x in xs)
достаточно двусмысленный, который мы решили запретить, - обратите внимание, чтоf(x for x in xs)
уже является некоторым частным случаем, потому что аргумент может быть только выражение "голого" генератора, если оно является единственным аргументом. То же рассуждение не применяется (в этой форме), чтобы перечислить, установить и определить выражения - в то время какf(x for x in xs)
идентично по значениюf((x for x in xs))
,[x for x in xs]
НЕ совпадает с[(x for x in xs)]
(что список один элемент, а элемент является генератором выражение)
(Акцент мой)
Я также заглянул в поисковый трекер Python для этой функции. Я нашел проблему, в которой обсуждалась дискуссия при ее реализации. Последовательность сообщений, которые помогли им прийти к этой реализации, начинается здесь с хорошим обзором введенной двусмысленности, представленной в msg234766 с помощью GvR.
В страхе от ссылки-гниения я прикрепляю сообщение (отформатированное) здесь:
Итак, я думаю, что тестовая функция здесь должна быть:
def f(*a, **k): print(list(a), list(k))
Затем мы можем попробовать такие вещи, как:
f(x for x in ['ab', 'cd'])
который печатает объект-генератор, потому что это интерпретируется как аргумент, который выражает генератор.
Но теперь рассмотрим:
f(*x for x in ['ab', 'cd'])
Я лично ожидал, что это будет эквивалентно:
f(*'ab', *'cd')
IOW:
f('a', 'b', 'c', 'd')
PEP не дает ясности относительно того, что здесь делать. Вопрос в том, должны ли мы интерпретировать такие вещи, как
*x for x in ...
как расширенную форму выражения генератора, или как расширенную форму*arg
? Я как-то думаю, что последнее более полезно, а также более логичное расширение.Мое рассуждение состоит в том, что PEP поддерживает такие вещи, как
f(*a, *b)
, и было бы довольно логично интерпретироватьf(*x for x in xs)
как выполнение объекта*x
для каждогоx
в спискеxs
.
Наконец, как отмечено в разделе Аннотация соответствующего PEP, эта функция не полностью исключена:
Этот PEP не включает распаковку операторов внутри списка, набора и понимания словаря, хотя это не исключалось для будущих предложений.
Итак, мы могли бы увидеть его когда-нибудь в ближайшее время (определенно, не 3.6, хотя:-), и я надеюсь, что мы это сделаем, они выглядят красиво.