2013-10-01 13 views
7

Quindi a quanto pare non posso fare questo in Python (2.7):Python: perché non (a, b, c) = (* x, 3)

x = (1, 2,) 
(a, b, c) = (*x, 3) 

Aveva senso nella mia testa, ma bene ... potrei creare una funzione:

make_tuple = lambda *elements: tuple(elements) 

allora posso fare

(c, a, b) = make_tuple(3, *x) 

ma non, ad esempio

(a, b, c) = make_tuple(*x, 3) 
(a, b, c, d) = make_tuple(*x, *x) 
y = [3, 4] 
(a, b, c, d) = (*x, *y,) 

Quindi quello che chiedo è

  1. C'è una ragione per non permettere questo? (la prima cosa)
  2. qual è la cosa più vicina che funziona?

Il mio attuale ipotesi per 2 #:

(a, b, c) = x + (3,) 
(a, b, c, d) = x + x 
(a, b, c, d) = x + tuple(y) 

risposta

8

in risposta alla domanda 1, ha letto il PEP 448 e bug 2292. Interessante è anche la discussione nel mailing list. Nel riprendere ciò che si desidera dovrebbe essere consentito in Python 3.4. Per la domanda 2 vedi le altre soluzioni.

+0

aggiunta interessante, e grande! – Mark

2

Non dimenticare itertools. Di solito è più leggibile come le cose si fanno più complesse

>>> from itertools import chain 
>>> a,b,c = chain(x, (3,)) 
>>> a,b,c,d = chain(x, x) 
>>> a,b,c,d = chain(x, y) 
+0

Probabilmente l'alternativa migliore, anche se è un peccato che 3 debba ancora essere trasformato in una tupla ... – Mark

+1

@Mark, non c'è un "appiattimento" incorporato, ma molte delle destinazioni appiattite su SO ti consentono di dire "a" b, c = flatten ((x, 3)) '. Potresti supportare 'flatten (x, 3)' senza troppo lavoro extra. –

1

Cosa si può fare in Python 2.7 è:

(a, b), c = x, 3 
+0

In effetti una buona soluzione in questo caso, anche se non può creare una tupla – Mark

Problemi correlati