如何在python中支持两种类型的函数参数

时间:2016-11-18 16:54:49

标签: python function arguments

我想设计一个函数f(x),其输入可以是

  • 一个对象
  • 或对象列表

在第二种情况下,f(x)应返回相应结果的列表。

我正在考虑将其设计如下。

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

    return result

这是一个好设计吗?这样做的规范方法是什么?

4 个答案:

答案 0 :(得分:4)

不,这不是好设计。

将函数设计为仅采用一种数据类型。如果调用者只有一个项目,那么在调用之前将它们包装在列表中是微不足道的。

result = f([list x])

或者,让函数只接受一个值,调用者可以轻松地将该函数应用于列表:

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

答案 1 :(得分:4)

当他们有一个列表时,他们可以很容易地映射该函数(例子):

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

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

请记住:该功能应该做一件事,做得好:)

答案 2 :(得分:1)

我避免它。我最大的问题是,有时你会返回一个列表,有时候你会返回一个对象。我让它在列表对象上运行,然后让用户处理包装对象,在列表解析中调用函数。
如果你真的需要让它同时工作,我认为你最好不要使用:

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

这样你总是会返回一个列表。

答案 3 :(得分:0)

实际上,实施可能有效(但有改进的余地)。问题是你正在创造一个暧昧和意想不到的行为。最好的方法是拥有2个不同的函数f(x)f_on_list()或类似的东西,其中第二个将第一个函数应用于列表。

相关问题