Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用默认参数传递多个元组_Python_Python 3.x_Arguments_Parameter Passing - Fatal编程技术网

Python 使用默认参数传递多个元组

Python 使用默认参数传递多个元组,python,python-3.x,arguments,parameter-passing,Python,Python 3.x,Arguments,Parameter Passing,我意识到这可能是一个有点奇怪的请求,但我想让一个方法在Python3中接受任意数量的元组,每个元组都有默认参数 我之所以想这样做,是因为我正在为我们的团队编写脚本功能,并且希望用户能够轻松理解可调用的方法。例如,如果用户希望调用2D plotting方法,我希望方法参数如下所示: plot2D(('sweepvar1', start1, stop1, npts1=None, step1=None), ('sweepvar2', start2, stop2, npts2=None,

我意识到这可能是一个有点奇怪的请求,但我想让一个方法在Python3中接受任意数量的元组,每个元组都有默认参数

我之所以想这样做,是因为我正在为我们的团队编写脚本功能,并且希望用户能够轻松理解可调用的方法。例如,如果用户希望调用2D plotting方法,我希望方法参数如下所示:

plot2D(('sweepvar1', start1, stop1, npts1=None, step1=None),
       ('sweepvar2', start2, stop2, npts2=None, step2=None))
所以用户调用类似这样的东西

plot2D(('var1', 0.0, 1.0, npts1=101), ('var2', 0.5, 0.6, step2=0.001))
从本质上说,困难来了,因为我不知道用户是否想要指定测量的点数或步长,但我们需要包括这两个选项。理想情况下,我希望避免强制用户同时指定这两个变量,或者创建一个新变量,作为在
npts
step
之间进行选择的标志

我对
默认参数
*args
**kwargs
有点熟悉,但我似乎无法为上述问题找到一个干净的解决方案


提前感谢您的帮助

这似乎很难实现,但您可以创建一个helper函数,它包装参数并为每个元组创建一个位置和关键字参数元组。调用
mkarg
(生成参数)

此测试返回:

(('var1', 0.0, 1.0), {'npts1': 101}) (('var2', 0.5, 0.6), {'step2': 0.001})
现在繁琐的工作是在
plot2D
中处理这些参数,但至少用户有一个清晰的界面

备选方案:

如果您确实想要元组,可以检查元组参数的
len
,如果不够长,可以使用
None
完成。如果第二个“可选”值的使用量小于第一个值,则这很好。适用于少量“可选”值


这些不是元组,因为这些包含命名参数…看起来更像命名元组。也许你应该使用自定义对象而不是元组,这样用户就可以正确初始化所有内容。我知道这听起来很琐碎,也许没有更好的方法,但我希望找到一种解决方案,它不涉及诸如
plot2D(CustomObject('var1',0.0,1.0,npts=101),CustomObject('var2',0.0,1.0,step=0.01))
@spaderdabomb我提供了两种选择。当然没有一个完全符合你的需要。哦,太好了,我真的很喜欢这个选择!有点疯狂,我甚至没有考虑过。我认为强制用户指定
None
实际上并不会产生太多开销,所以听起来它对我来说会很好。有趣的是:这是我的第一个答案,但我删除了它(因为我认为passing by关键字对你来说更重要)
(('var1', 0.0, 1.0), {'npts1': 101}) (('var2', 0.5, 0.6), {'step2': 0.001})
def plot2D(tuple1,tuple2):
    tuple1 += (None,)*(5-len(tuple1))
    tuple2 += (None,)*(5-len(tuple2))

plot2D(('var1', 0.0, 1.0, 101), ('var2', 0.5, 0.6, None, 0.001))