繁体   English   中英

带有其他指定关键字参数的python函数* args和** kwargs

[英]python function *args and **kwargs with other specified keyword arguments

我有一个带有方法的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得到SyntaxError: non-keyword arg after keyword arg 第一种情况怎么了? 我应该如何告诉我的方法接受默认参数以外的任何用户参数和关键字参数? (希望我的问题很清楚)

您将使用其他模式:

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

如果未定义关键字参数,则可以在保留后备值的同时使用*和**。

在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'}
>>> 

这是Jure C.的回答。

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

我更改了get pop以从kwargs删除xlabelylabel (如果存在)。 我这样做是因为在原来问题的代码的其余部分包含通过所有意味着迭代循环kwargs 除了 xlabelylabel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM