【问题标题】:Passing multiple tuples with default parameters使用默认参数传递多个元组
【发布时间】:2018-02-23 21:37:38
【问题描述】:

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

我想这样做的原因是因为我正在为我们的小组编写脚本功能,并且希望用户的可调用方法易于理解。例如,如果用户想要调用 2D 绘图方法,我希望方法参数看起来像这样:

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))

基本上困难来了,因为我不知道用户是否想为测量指定点数或步长,但我们需要同时包含这两个选项。理想情况下,我想避免强迫用户同时指定两者,或者创建一个新变量作为在nptsstep 之间进行选择的标志。

我对@9​​87654325@、*args**kwargs 有点熟悉,但我似乎无法对上述问题提出一个干净的解决方案。

提前感谢您的帮助!

【问题讨论】:

  • 这些不是元组,因为它们包含命名参数...
  • 看起来更像命名元组。
  • 也许您应该使用自定义对象而不是元组,以便用户可以正确初始化所有内容。
  • 我知道这听起来很琐碎,也许没有更好的方法可以做到,但我希望找到一个不涉及plot2D(CustomObject('var1', 0.0, 1.0, npts=101), CustomObject('var2', 0.0, 1.0, step=0.01))之类的解决方案
  • @spaderdabomb 我提供了 2 个替代方案。当然,它们都不完全符合您的需求。

标签: python python-3.x arguments parameter-passing


【解决方案1】:

这似乎很难按原样实现,但是您可以创建一个辅助函数来包装参数并为每个元组创建一个位置和关键字参数的元组。称它为mkarg(提出论点)

def mka(*args,**kwargs):
    return (args,kwargs)

def plot2D(t1,t2):
    print(t1,t2)

plot2D(mka('var1', 0.0, 1.0, npts1=101), mka('var2', 0.5, 0.6, step2=0.001))

这个测试返回:

(('var1', 0.0, 1.0), {'npts1': 101}) (('var2', 0.5, 0.6), {'step2': 0.001})

现在繁琐的工作是处理plot2D中的那些参数,但至少用户有一个清晰的界面。

替代方案:

如果你真的想要元组,你可以检查你的元组参数的len,如果不够长,可以用None 完成。如果第二个“可选”值的使用比第一个少,那就太好了。对于少量的“可选”值很实用。

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))

【讨论】:

  • 哦,太好了,我真的很喜欢这个选择!有点疯狂,我什至没有考虑到这一点。我认为强制用户指定 None 在现实中不会产生那么多开销,所以这听起来对我来说很有效。
  • 有趣的部分:这是我的第一个答案,但我删除了它(因为我认为传递关键字对你来说更重要)
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2011-12-24
  • 2015-12-07
  • 2012-08-06
相关资源
最近更新 更多