【问题标题】:python function *args and **kwargs with other specified keyword arguments带有其他指定关键字参数的 python 函数 *args 和 **kwargs
【发布时间】:2012-12-09 20:21:37
【问题描述】:

我有一个 Python 类,它的方法应该以这种方式接受参数和关键字参数

class plot:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs):
        for arg in args:
            <do something>
        for key in kwargs:
             <do somethng else>

调用时:

plt = plot(x, y)
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3")

我收到错误:TypeError: set_axis() got multiple values for keyword argument 'xlabel'

无论如何,如果我将我的方法设置为

class plot:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def set_axis(self, xlabel="x", ylabel="y", *args, **kwargs):
        for arg in args:
            <do something>
        for key in kwargs:
             <do somethng else>

然后调用:

plt = plot(x, y)
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3")

正如我所料,我收到了SyntaxError: non-keyword arg after keyword arg。 第一种情况有什么问题?我应该如何告诉我的方法接受任何用户参数和关键字参数,而不是默认参数? (希望我的问题足够清楚)

【问题讨论】:

  • 您使用的是什么版本的 Python?您列出的第一个类在 Python 2.7.3 中无法解析,因为 *args 后面是 set_axis 定义中的参数名称。

标签: python python-2.7 methods args keyword-argument


【解决方案1】:

对于 Jure C. 的回答,这里稍作调整:

def set_axis(self, *args, **kwargs):
    xlabel = kwargs.pop('xlabel', 'x')
    ylabel = kwargs.pop('ylabel', 'y')

我将get 更改为pop 以从kwargs 中删除xlabelylabel(如果存在)。我这样做是因为原始问题中的其余代码包含一个循环,该循环旨在遍历所有 kwargs 除了 xlabelylabel

【讨论】:

    【解决方案2】:

    在 Python 3 中这有效:

    Python 3.2.3 (default, Oct 19 2012, 19:53:16) 
    >>> def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs):
    ...     print(args, xlabel, ylabel, kwargs)
    ... 
    >>> set_axis(None, "test1", "test2", xlabel="new_x", my_kwarg="test3")
    ('test1', 'test2') new_x y {'my_kwarg': 'test3'}
    >>> 
    

    【讨论】:

      【解决方案3】:

      你会使用不同的模式:

      def set_axis(self, *args, **kwargs):
          xlabel = kwargs.get('xlabel', 'x')
          ylabel = kwargs.get('ylabel', 'y')
      

      这允许您在未定义关键字参数的情况下使用 * 和 ** 同时保留备用值。

      【讨论】:

      • 怎么样?它要么在 kwargs 中定义并读取其值,要么使用后备“x”值。
      • 这是完成此任务的唯一方法吗?我觉得你不应该为了混合 *args 和命名参数而恢复在 **kwargs 中使用所有关键字 args
      猜你喜欢
      • 2023-04-06
      • 2020-11-03
      • 2022-12-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多