forwarding *arg parameter

Steve Holden steve at holdenweb.com
Mon Nov 6 14:28:59 EST 2006


Tuomas wrote:
> 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

Suppose you did actually want to do this you have chosen about the worst 
possible way: the use of global variables to condition function 
execution is a sure way to get into trouble. Consider if somebody else 
want to use your function: they also have to set a global in their 
program to avoid your function raising an exception.

Fortunately Python has just the thing to make such horrors unnecessary: 
the default argument value. Try something like this (untested):

def g(flattening=True, *arg):
     if flattening:
	arg = flatten(arg)
     return arg

Obviously you could use either True or False for the default value. In 
the case above the function flattens by default. You could also, if you 
wished, have f() take the flattening argument, and always pass it to g().

Nothing very sophisticated here, just something to help you flex your 
growing Python and programming muscles.

regards
  Steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC/Ltd          http://www.holdenweb.com
Skype: holdenweb       http://holdenweb.blogspot.com
Recent Ramblings     http://del.icio.us/steve.holden




More information about the Python-list mailing list