fmo*_*lia 13 python methods args kwargs python-2.7
我有一个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>
Run Code Online (Sandbox Code Playgroud)
打电话时:
plt = plot(x, y)
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3")
Run Code Online (Sandbox Code Playgroud)
我收到错误: 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>
Run Code Online (Sandbox Code Playgroud)
并致电:
plt = plot(x, y)
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3")
Run Code Online (Sandbox Code Playgroud)
我得到了SyntaxError: non-keyword arg after keyword arg,正如我所期待的那样.第一种情况有什么问题?我应该如何告诉我的方法接受任何用户参数和关键字参数,而不是默认参数?(希望我的问题很清楚)
Jur*_* C. 14
您将使用不同的模式:
def set_axis(self, *args, **kwargs):
xlabel = kwargs.get('xlabel', 'x')
ylabel = kwargs.get('ylabel', 'y')
Run Code Online (Sandbox Code Playgroud)
如果未定义关键字参数,这允许您在保留回退值的同时使用*和**.
war*_*iuc 14
在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'}
>>>
Run Code Online (Sandbox Code Playgroud)
以下是 Jure C. 的回答的一个小改动:
def set_axis(self, *args, **kwargs):
xlabel = kwargs.pop('xlabel', 'x')
ylabel = kwargs.pop('ylabel', 'y')
Run Code Online (Sandbox Code Playgroud)
我改为get删除pop并xlabel从ylabel(kwargs如果存在)中删除。我这样做是因为原始问题中的其余代码包含一个循环,该循环旨在迭代除kwargs for xlabel和之外的所有代码ylabel。
| 归档时间: |
|
| 查看次数: |
8290 次 |
| 最近记录: |