nos
nos

Reputation: 20862

How to support two types of function arguments in python

I would like to design a function f(x) whose input could be

In the second case, f(x) should return a list of the corresponding results.

I am thinking of designing it as follow.

def f(x):
    if isinstance(x, list):
        return [f(y) for y in x]
    # some calculation
    # from x to result

    return result

Is this a good design? What would be the canonical way to do this?

Upvotes: 4

Views: 847

Answers (4)

Batman
Batman

Reputation: 8917

I'd avoid it. My biggest issue with it is that sometimes you're returning a list, and sometimes you're returning an object. I'd make it work on a list or an object, and then have the user deal with either wrapping the object, of calling the function in a list comprehension.
If you really do need to have it work on both I think you're better off using:

def func(obj):
    if not isinstance(obj, list):
        obj = [obj]
    # continue

That way you're always returning a list.

Upvotes: 1

Bryan Oakley
Bryan Oakley

Reputation: 385930

No, it's not good design.

Design the function to take only one datatype. If the caller has only one item, it's trivial for them to wrap that in a list before calling.

result = f([list x])

Or, have the function only accept a single value and the caller can easily apply that function to a list:

result = map(f, [x,  y, z])

Upvotes: 4

user2693928
user2693928

Reputation:

They can easily map over the function when they have a list(example):

def f(x):
    return x + 1 #calcuation

lst = map(f, [1, 2, 3])
print(lst) # [2, 3, 4]

And remember: The function should do one thing and do it well :)

Upvotes: 4

Chobeat
Chobeat

Reputation: 3535

Actually the implementation may be valid (but with room for improvement). The problem is that you're creating an ambigous and unexpected behaviour. The best way would be to have 2 different functions f(x) and f_on_list() or something like this, where the second apply the first to a list.

Upvotes: 0

Related Questions