forwarding *arg parameter
Tuomas
tuomas.vesterinen at pp.inet.fi
Mon Nov 6 08:03:55 EST 2006
Steven D'Aprano wrote:
> On Sun, 05 Nov 2006 19:35:58 +0000, Tuomas wrote:
>
>
>>Thanks. My solution became:
>>
>> >>> def flattern(arg):
>>... result = []
>>... for item in arg:
>>... if isinstance(item, (list, tuple)):
>>... result.extend(flattern(item))
>>... else:
>>... result.append(item)
>>... return tuple(result)
>>...
>> >>> def g(*arg):
>>... arg = flattern(arg)
>>... return arg
>>...
>> >>> def f(*arg):
>>... return g(arg)
>>...
>> >>> f('foo', 'bar')
>>('foo', 'bar')
>
>
>
> That's the most complicated do-nothing function I've ever seen. Here is a
> shorter version:
>
> def shortf(*args):
> return args
>
>
>
>>>>f('foo', 'bar')
>
> ('foo', 'bar')
>
>>>>shortf('foo', 'bar')
>
> ('foo', 'bar')
>
>
>>>>f(1,2,3,4)
>
> (1, 2, 3, 4)
>
>>>>shortf(1,2,3,4)
>
> (1, 2, 3, 4)
>
>
>>>>f({}, None, 1, -1.2, "hello world")
>
> ({}, None, 1, -1.2, 'hello world')
>
>>>>shortf({}, None, 1, -1.2, "hello world")
>
> ({}, None, 1, -1.2, 'hello world')
>
> Actually, they aren't *quite* identical: your function rips lists apart,
> which is probably not a good idea.
>
>
>>>>f("foo", [1,2,3], None) # three arguments turns into five
>
> ('foo', 1, 2, 3, None)
>
>>>>shortf("foo", [1,2,3], None) # three arguments stays three
>
> ('foo', [1, 2, 3], None)
>
>
>
> I still don't understand why you are doing this. Can we have an example of
> why you think you need to do this?
If i redefine the function g the difference comes visible:
>>> def g(*arg):
... if with_flattern: arg=flattern(arg)
... return arg
>>> with_flattern=False
>>> f('foo', 'bar')
(('foo', 'bar'),)
>>> with_flattern=True
>>> f('foo', 'bar')
If you read the whole chain you find out what we were talking of.
TV
More information about the Python-list
mailing list