赞
踩
我在想什么是最好的(最简单的)解决方案,将一个列表或变量数量的参数传递给一个函数/方法。
例如,我必须学习以下课程:
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 = Dataset([4,3,5])
号
或变量数或参数:
ds1 = Dataset(4,3,5)
号
那么,什么是最好的实现,我是否在正确的轨道上?
我不认为这是你想要的,但是如果你把一个*放在你要通过的列表之前(即:ds1 = Dataset(*[4,3,5]),列表将被解包,它将与你键入的一样:ds1 = Dataset(4,3,5)。因为您已经接受了*args作为一个参数,这是您所要做的全部工作。如果这是你想要的,请告诉我,这样我可以把它作为回答,让其他游客看到。
接受列表或varargs。不要两者兼而有之。
@阿兰费,你能解释一下为什么吗?
@Dennispatterson回答得很好,但对于这个特定的案例,我认为Progmatico的解决方案最能回答我的问题;3
@因为它引入了歧义。如果你的函数被称为func([1, 2]),你怎么知道它是指func(1, 2)还是func([[1, 2]])?
@很抱歉,作为一个新用户,我的问题可能写得不够好,但我不明白为什么func([1,2])会被误认为func([1,2])?为了这个例子,我已经剥离了异常处理的代码,但是如果使用二维数组(或更多)调用该方法,它将引发异常。
如果您的函数被称为func(1)或func(1, 2)或func([1], [2]),那么很明显应该发生什么。但是,如果函数的调用类似于func([1, 2]),那么不清楚的是,该列表是应该解包的(类似于func(1, 2))还是应该是单个参数的列表(类似于func(1),除了1被[1, 2]替换)?
@AranFey我认为应该解包,因为如果每个元素的格式合适(int,float….),就应该检查每个元素。
@我编辑了我的答案。
你可以试试这个,
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"构建为列表元素?
您需要一个参数列表或变量数,但是列表本身也有一个"变量数参数"。
所以要使用其中一个。如果你继续最初的想法,至少保持简单,就像这个答案。
正是我要找的!但是,如果你(或其他人)能告诉我更多关于这是完成这项任务最常见的方法,例如,在专业环境中,这是否被认为是一种好方法,还是不太可能?
我编辑了我的答案@kamenhristov,也许很好地满足了需求,但是在Python中,这个需求并不好。
感谢您的回复,您只提供了我正在寻找的信息类型!肯定会研究functools.singledispatch,并尽量使我的代码清晰明了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。