13

我有一个 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了,正如我所期待的。第一种情况有什么问题?我应该如何告诉我的方法接受任何用户参数和关键字参数,而不是默认参数?(希望我的问题足够清楚)

4

3 回答 3

15

In Python 3 this works:

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'}
>>> 
于 2012-12-22T15:59:40.953 回答
14

You would use a different pattern:

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

This allows you to use * and ** while keeping the fallback values if keyword arguments aren't defined.

于 2012-12-22T15:57:07.557 回答
3

这是对 Jure C. 的回答的一个简短的一周:

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

我更改getpop删除xlabelylabel删除(kwargs如果存在)。我这样做是因为原始问题中的其余代码包含一个循环,该循环旨在遍历kwargs xlabeland之外的所有内容ylabel

于 2016-05-18T19:37:13.920 回答