¿Cuál es la forma pitónica de descomprimir tuplas como argumentos de función? [duplicate]

1 minuto de lectura

avatar de usuario de user132262
usuario132262

esto es feo ¿Cuál es una forma más pitónica de hacerlo?

import datetime

t= (2010, 10, 2, 11, 4, 0, 2, 41, 0)
dt = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5], t[6])

Avatar de usuario de Eli Bendersky
Eli Bendersky

En general, puede utilizar el func(*tuple) sintaxis. Incluso puede pasar una parte de la tupla, que parece ser lo que está tratando de hacer aquí:

t = (2010, 10, 2, 11, 4, 0, 2, 41, 0)
dt = datetime.datetime(*t[0:7])

Se llama desempacar una tupla, y también se puede usar para otros iterables (como listas). He aquí otro ejemplo (de la Tutorial de Python):

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]

  • Funciona para iterables arbitrarios.

    –Mike Graham

    10 de febrero de 2010 a las 16:36

  • Me gustaría agregar que esta sintaxis funciona en cualquier lugar (no solo en llamadas a funciones) en python 3.5, por ejemplo, declaraciones como x, y, z = *(1, 2, 3) funcionará sin errores (como debería haber sido hace mucho tiempo)

    – Nearoo

    1 de enero de 2016 a las 16:05


  • ¿Hay alguna manera de hacer esto entre otros elementos de la lista? como my_tuple = ("B", "C"); "%s %s %s" % ("A", *my_tuple)?

    – Dannid

    24/03/2016 a las 18:10

  • No importa, creo que esto es una limitación del método de sustitución de cadenas %s. Usando "{} {} {}".format("A", *my_tuple) en cambio hace el truco.

    – Dannid

    24/03/2016 a las 23:36

  • ¿Alguien sabe algún detalle sobre cómo Python implementa el desempaquetado internamente?

    – dopatramán

    17 de noviembre de 2017 a las 18:37

Avatar de usuario de Charles Beattie
charles beattie

Referirse https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

 dt = datetime.datetime(*t[:7])

¿Ha sido útil esta solución?