function taking scalar or list argument

Peter Otten __peter__ at web.de
Mon Aug 23 20:27:41 CEST 2004


beliavsky at aol.com wrote:

> 
> I can define a function that transforms either a scalar or each element in
> a list as follows:
> 
> def twice(x):
>     try:
>         return map(twice,x)
>     except:

A bare except without the type of exception is always bad.

>         return 2*x
> 
> print twice(3) # 6
> print twice([1,4,9]) # [2,8,18]
> 
> Is this good style? I intend to define many functions like this and want
> to use the right method. Thanks.
 
I'd say you've just discovered a use case for a decorator:

def scalarOrVector(f):
    def g(arg):
        try:
            return map(f, arg) # or map(g, arg) if you want to allow 
                               # nested sequences
        except TypeError:
            return f(arg)
    return g

#@scalarOrVector
def twice(a):
    return 2*a
twice = scalarOrVector(twice)

print twice(3) # 6
print twice([1,4,9]) # [2,8,18]

Of course you will have to ensure that map(f, arg) _does_ throw an
exception.

Peter





More information about the Python-list mailing list