web-dev-qa-db-fra.com

Python décompactage en étoile pour la version 2.7

Comme mentionné ici , vous pouvez utiliser l'étoile pour décompresser un nombre inconnu de variables (comme dans les fonctions), mais uniquement dans python 3:

>>> a, *b = (1, 2, 3)
>>> b
[2, 3]
>>> a, *b = (1,)
>>> b
[]

En python 2.7, le mieux que je puisse trouver est (pas terrible, mais ennuyeux):

c = (1, 2, 3)
a, b = c[0], c[1:] if len(c) > 1 else []

Existe-t-il un moyen d'importer cela à partir de la division __future__, ou aurai-je besoin de ma propre fonction pour effectuer un déballage de longueur inconnue dans python 2.7?

34
beardc

dans python 2.X, vous pouvez faire:

c = (1, 2, 3)
a, b = c[0], c[1:]

tant que c a au moins un membre, cela fonctionnera car si c ne contient qu'une seule chose c[1:] est [].

Vous devriez probablement vous assurer qu'il y a au moins une chose dans c, sinon c[0] lèvera une exception.

Vous pourriez faire quelque chose comme:

try:
    c = Tuple(c)
    a, b = c[0], c[1:]
except TypeError, IndexError:
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it.
    # do something else
    pass
31
Andbdrew
(a,b) = (None, []) if not len(c) else (c[0], c[1:])

est également une option pour gérer le cas où c est une séquence vide, bien qu'il ne fasse pas de distinction entre [Aucun] et [] en termes d'affectations à a, b. Alors utilisez-le avec soin, le try/except est probablement le meilleur.

Je ne vois aucune réelle différence entre Python 3 et 2.7 lors de la manipulation d'un conteneur vide, mais la bonne chose à propos de Python 3 ici, c'est que cela fonctionne avec n'importe quel itérable).

Cela fonctionne en 2.7 si vous savez que c est un générateur.

a,b = c.next(), c

Mais toute la beauté du déballage semble nécessiter Python 3.

2
Pete Cacioppi

réponse à ex13.py

from sys import argv

script=argv

def Fun(arg1, *argv): 
    print "First argument :", script 

    for arg in argv: 
        print"Your variable is:", arg

Fun('scrpit', 'first', 'second', 'third')
0
Haminger 2012