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



我想知道最好的(最Python的(解决方案是向函数/方法传递一个列表或可变数量的参数。

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

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

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

ds1=数据集([4,3,5](

或变量数或参数:

ds1=数据集(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没有。

测试参数类型是不符合语法的,因为Python是一种动态类型语言。您可以这样做,但您将函数的有用性限制为特定类型。

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

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

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

现在阿兰菲给你很好的建议。像这样的编码行为在Python中并不常见,而且实际上会引入歧义。您的API合同变得不明确。我应该传递一个列表或varargs吗。为什么要选择?仅仅因为你已经有了带有*args和*kwargs的元组和dict,还想要列表吗?将"varargs"构建为列表元素怎么样?

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

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

相关内容

  • 没有找到相关文章

最新更新