当前位置:   article > 正文

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

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 = 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,并尽量使我的代码清晰明了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/71223?site
推荐阅读
相关标签
  

闽ICP备14008679号