关于python:将列表或可变数量的参数作为方法参数传递

Pass a list or variable number of arguments as method parameters

我在想什么是最好的(最简单的)解决方案,将一个列表或变量数量的参数传递给一个函数/方法。

例如,我必须学习以下课程:

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

这是setter属性的一部分:

1
2
3
4
5
6
7
8
9
@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

我搜索了网页,但找不到太多关于这个话题的内容。这里我的目标是设计类构造函数,使其与给定参数的列表一起工作:

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

或变量数或参数:

ds1 = Dataset(4,3,5)

那么,什么是最好的实现,我是否在正确的轨道上?


你可以试试这个,

1
2
3
4
5
6
7
8
9
10
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])

输出:

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

号编辑:

此代码以简单的方式执行您想要的操作。没别的了。还有其他方法,我觉得它们不简单。

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

问题不在这段代码中,而是在您所要求的和Python语言中。您需要方法重载,而python没有。

测试参数类型是不精确的,因为python是一种动态类型语言。您可以这样做,但是您将函数的实用性限制为特定的类型。

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

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

因为Python不直接支持方法/函数重载,所以您所要求的不是要使用的通用模式。

现在阿兰费给了你很好的建议。这种编码行为在Python中很少见,实际上会引入歧义。您的API合同变得不清楚。我应该通过一个列表还是varargs。为什么选择?就因为你已经有了带*args和*kwargs的元组和dict,还想要列表吗?如何将"varargs"构建为列表元素?

您需要一个参数列表或变量数,但是列表本身也有一个"变量数参数"。

所以要使用其中一个。如果你继续最初的想法,至少保持简单,就像这个答案。