[Python] *args vs. [1,2,3]

Alessandro Dentella sandro a e-den.it
Lun 16 Mar 2009 16:52:42 CET


On Mon, Mar 16, 2009 at 03:46:47PM +0100, Manlio Perillo wrote:
...
> >   dizionari) ma vedo che non è così.
> > 
> >      def test(*args, **kw):
> > 	 pass
> > 
> >      a = [1,2,3]
> >      test(1,2,3, junk=True )    # funziona
> >      test(*a, junk=True )       # solleva syntax error
> > 
> 
> Stai facendo confusione su cosa faccia f(*a).

non mi pare proprio...

> E' chiamato scompattamento della lista di argomenti:
> http://docs.python.org/tutorial/controlflow.html#tut-unpacking-arguments
> 
> def f(a, b, c):
>      print a, b, c
> 
> a = [1, 2, 3]
> f(*a)

ed è ben così che l'ho usata anche nell'esempio


On Mon, Mar 16, 2009 at 04:05:51PM +0100, Daniele Varrazzo wrote:
> test(junk=True, *a) funziona come ti aspetti

questo lo avevo notato, ma il mio cervello lo ha filtrato, avendo presente che

> è vero che gli argomenti posizionali vanno dopo quelli nominali (quindi
> "test(foo=10, 1)" è un errore), 

già..

> ma gli argomenti * e ** vanno comunque alla fine.

ecco la parte che mi mancava! 

Leggendo la documentazione che mi hai indicato::

  consequence of this is that although the *expression syntax may appear
  after some keyword arguments, it is processed before the keyword arguments

dice solo *may appear*, non *must appear*, bisogna leggere con attenzione la
grammatica per cogliere quello mi era sfuggito!


grazie
*:-)


Maggiori informazioni sulla lista Python