asterisco en tupla, lista y definiciones de conjuntos, doble asterisco en definición de dict

Estoy jugando ahora con el intérprete de Python 3.5 y encontré un comportamiento muy interesante:

>>> (1,2,3,"a",*("oi", "oi")*3) (1, 2, 3, 'a', 'oi', 'oi', 'oi', 'oi', 'oi', 'oi') >>> [1,2,3,"a",*range(10)] [1, 2, 3, 'a', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> ('aw','aw',*range(10),*(x**2 for x in range(10))) ('aw', 'aw', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 4, 9, 16, 25, 36, 49, 64, 81) >>> {"trali":"vali", **dict(q=1,p=2)} {'q': 1, 'p': 2, 'trali': 'vali'} >>> {"a",1,11,*range(5)} {0, 1, 2, 3, 4, 11, 'a'} 

Nunca he visto eso ni en la documentación ni en los ejemplos ni en ningún código fuente a pesar de varios años de experiencia en Python. Y lo encontré muy útil.

Y me parece lógico desde el punto de vista de la gramática de Python. Los argumentos de función y la tupla se pueden analizar con estados iguales o similares.

¿Está documentado el comportamiento? ¿Dónde está documentado?

¿Qué versiones de Python tienen esta funcionalidad?

Esto es PEP-448: Generalizaciones de desempaquetado adicionales , que es nuevo en Python 3.5.

El registro de cambios relevante se encuentra en https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations :

PEP 448 extiende los usos permitidos del * operador de desempaquetado iterable y el ** operador de desempaquetado del diccionario. Ahora es posible utilizar un número arbitrario de desempaquetados en llamadas a funciones:

 >>> >>> print(*[1], *[2], 3, *[4, 5]) 1 2 3 4 5 >>> def fn(a, b, c, d): ... print(a, b, c, d) ... >>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4}) 1 2 3 4 

De manera similar, las pantallas de tuplas, listas, conjuntos y diccionarios permiten múltiples desempaquetados:

 >>> >>> *range(4), 4 (0, 1, 2, 3, 4) >>> [*range(4), 4] [0, 1, 2, 3, 4] >>> {*range(4), 4, *(5, 6, 7)} {0, 1, 2, 3, 4, 5, 6, 7} >>> {'x': 1, **{'y': 2}} {'x': 1, 'y': 2}