传递一个列表或可变数量的参数作为方法参数

Pass a list or variable number of arguments as method parameters

我想知道最好的(最 pythonic 的)解决方案是将列表或可变数量的参数传递给 function/method。

例如我必须遵循 class:

class Dataset():
def __init__(self, *args):
    self.data_set = args

这是 setter 属性 的一部分:

@data_set.setter
def data_set(self, args):
    data = []
    for item in args:
        if type(item) is list:
            data = [k for k in item]
            break
        data.append(item)
    self._data_set = data

我在网上搜索过,但找不到太多关于该主题的内容。 我的目标是设计 class 构造函数,使其与作为给定参数的列表一起工作:

ds1 = Dataset([4,3,5])

或变量数或参数:

ds1 = Dataset(4,3,5)

那么,什么是最好的实施方式?我走在正确的轨道上吗?

你可以试试这个,

class Dataset():
    def __init__(self, *args):
        if isinstance(args[0], list) and len(args) == 1:
            print('Received a list')
        else:
            print('Received:', args)

obj = Dataset(1,2,3)
obj = Dataset([1,2,3], 2)
obj = Dataset([1,2,3])

输出:

Received: (1, 2, 3)                                                       
Received: ([1, 2, 3], 2)                                                  
Received a list 

编辑:

此代码以简单的方式完成您想要的操作。而已。还有其他方法, 它们在我看来并不简单。

您的评论实际上是一个很好的问题。

问题不在于此代码,而在于您所问的内容和 Python 语言。 您想要方法重载,而 Python 没有。

测试参数类型是非 pythonic 的,因为 Python 是动态类型 language.You 可以做到,但是您将函数的用途限制为特定类型。

测试参数类型也会产生典型的 if..elif 链。

如果您正在编写函数,请查看 functools.singledispatch 装饰器。 这从代码中消除了 if..elif 链。使用它,您可以定义一个基本函数并为每种类型注册特定的实现。简单易读。但这路由到基于第一个参数的函数实现。现在,例如方法,由于 self,这将不起作用。可以change that,但是看起来不简单了

因为Python不支持method/function直接重载,所以你问的不是常用模式

现在Aran Fey 给你很好的建议。像这样的编码行为在 Python 中并不常见,实际上会引入歧义。您的 API 合同变得不明确。我应该传递列表还是可变参数。为什么选择?仅仅因为您已经有了带有 *args 和 *kwargs 的元组和字典并且还想要列表?如何构建 "varargs" 作为列表元素?

你要求一个列表或可变数量的参数,但列表本身也有一个 "variable number of arguments"。

所以使用一个或另一个。如果您继续最初的想法,至少要像这个答案一样保持简单。