Tuples in function argument lists
Robert Kern
rkern at ucsd.edu
Sun Jul 17 09:26:39 EDT 2005
Steven D'Aprano wrote:
> I'm trying to understand the use of tuples in function argument lists.
>
> I did this:
>
>>>>def tester(a, (b,c)):
>
> ... print a, b, c
> ...
>
>>>>tester(1, 2)
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "<stdin>", line 1, in tester
> TypeError: unpack non-sequence
>
> That was obvious result.
>
>>>>tester(1, (2, 3))
>
> 1 2 3
>
>>>>tester('ab', 'ab')
>
> ab a b
>
> And so were those.
>
> Then I tried this:
>
>>>>def tester(a, (b,c)=None):
>
> ... if (b,c) is None:
> ... print a, None
> ... else:
> ... print a, b, c
>
> Needless to say, it did not do what I expected it to do. I didn't expect
> it to either :-)
>
> I tried looking at the language reference here:
>
> http://docs.python.org/ref/function.html
>
> but I can't seem to find anything in their that says that tuples-as-args
> are legal. Am I misreading the docs, or is this accidental behaviour that
> shouldn't be relied on?
Tuples-as-arg are legal. Tuple-as-keyword, too *if* the default value is
something that can actually unpack to a tuple. A default of None is...silly.
In [6]: def tester(a, (b,c)=(1,2)):
...: print a,b,c
...:
In [7]: tester(1)
1 1 2
Tuple-as-arg is probably pretty safe. Tuple-as-keyword, possibly
not-so-much.
> Does anyone use this behaviour, and if so, under what circumstances is it
> useful?
import math
def distance((x1,y1), (x2,y2)):
return math.sqrt((x2-x1)**2 + (y2-y1)**2)
distance(point1, point2)
Personally, I prefer to explicitly unpack the tuple in the function body.
--
Robert Kern
rkern at ucsd.edu
"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter
More information about the Python-list
mailing list