default tuple unpacking?

Bengt Richter bokr at oz.net
Wed Sep 4 00:38:34 EDT 2002


On Tue, 03 Sep 2002 23:58:39 -0400, Peter Hansen <peter at engcorp.com> wrote:

>Peter Hansen wrote:
>> Huaiyu Zhu wrote:
>> 
>>> It is often very convenient to have default arguments such as
>>>
>>>     def func(a, b, *c): ...
>>>
>>> Is there a way to use this in statements too?  Examples:
>>>
>>>     a, (b, *c), *d = e
>
>Hmm... I think there might be an inconsistency or an unexpected
>result in this.  What if e already contains a tuple?
>
>   e = (1, 2, 3)
>   *a = e        # a is ((1, 2, 3), )
>
>That seems sensible, and it's just what happens if you pass
>"e" in to a function defined as "def func(*a)".
>
>Now what about this:
>
>   a, *b = e     # a is 1, b is (2, 3)
>
>That's one possible result, and presumably the one you want with
No, I think you'd want it to match the function effect
>this syntax, but it's not what you'd get with the function syntax:
>
>   def func(a, *b):
>     print a
>     print b
>
>   func(e)
>
>Here of course you get (1, 2, 3) in "a" and () in b.  To get the
Fine
>same as the proposed syntax above, you can't pass in a tuple, but
>have to pass the parameters separately:
but you can separate them by unpacking with '*'
>
>   func(1, 2, 3)  # now a is 1, b is (2, 3)
>
You can write the call as
    func(*e)
>The problem is that in function calling, you can pass in a single
>tuple, which is one argument, or you can pass the elements separately
>as multiple arguments, which is when the special * syntax kicks in.
>
Kick it in on the calling side if that's what you want.
>When doing assignment with tuples you don't have the same two options:
>
>   a, *b = 1, 2, 3
>
>is the same as
>
>   a, *b = (1, 2, 3)
>
>So maybe this won't fly.  Comments?
>

With function calling, '*' gets you packing or unpacking depending on context.
Why not also for the above? I.e.,
   a, *b = 1, 2, 3    # => a is 1, b is (2, 3)
and 
   a, *b = (1, 2, 3)  # => a is (1, 2, 3), b is ()
but
   a, *b = *(1, 2, 3) # => a is 1, b is (2, 3)
much as in

 >>> def foo(a,*b): print 'a is %s, b is %s' % (a,b)
 ...
 >>> foo(1,2,3)
 a is 1, b is (2, 3)
 >>> foo((1,2,3))
 a is (1, 2, 3), b is ()
 >>> foo(*(1,2,3))
 a is 1, b is (2, 3)

and

 >>> e=(1,2,3)
 >>> foo(e)
 a is (1, 2, 3), b is ()
 >>> foo(*e)
 a is 1, b is (2, 3)

but

 >>> f=(1,2)
 >>> foo(f,3,4)
 a is (1, 2), b is (3, 4)
 >>> foo(*f,3,4)
   File "<string>", line 1
     foo(*f,3,4)
            ^
 SyntaxError: invalid syntax
 >>> foo(3,4,*f)
 a is 3, b is (4, 1, 2)

Hm. Why no unpacking at the front? (Ok, it's easier not to ;-)

Regards,
Bengt Richter



More information about the Python-list mailing list