Python __init__(self,**kwargs) takes 1 positional argument but 2 were given
我在python 3.6中创建了一个简单的类,它应该接受来自字典的键值作为参数。
我的代码:
1 2 3 4 5 6 7 8
| class MyClass:
def __init__(self, **kwargs):
for a in kwargs:
self.a=kwargs[a]
for b in a:
self.a.b = kwargs[a][b]
Test = MyClass( {"group1":{"property1":100,"property2":200},\
"group2":{"property3":100,"property4":200}}) |
我的代码返回错误:
TypeError: init() takes 1 positional argument but 2 were given
我希望test.group2.property4返回200
我发现了许多类似的问题,但是主要的问题是init方法中缺少"self"。但我有。
有人能解释这个错误的原因吗?谢谢
- 您告诉__init__接受任意数量的关键字参数,但使用两个位置参数来调用它(其中一个由python隐式提供,作为对所创建对象的引用,另一个是字典)。
将参数作为未解包的dict传递,而不是作为单个位置参数传递:
1 2
| MyClass(**{"group1":{"property1":100,"property2":200},\
"group2":{"property3":100,"property4":200}}) |
- 等价物:MyClass(group1={"property": 100, ...)。
- 谢谢您。然后它在"self.b=kwargs[a][b]"行上出现一个keyerror"g",所以它不想在dict的边上打开dict。另外,如果我试图在代码中只留下一个for循环,dir(myclass)返回(…a)而不是(…第1组,第2组)。它表示self.a在初始化时不会将自己转换为self.group1。
- 您建议的代码是否适用于您,或者它也提供了一个键错误?myClass(*"group1":"property1":100,"property2":200,"group2":"property3":100,"property4":200)
- 问题不在那行代码上。它有for循环。for b in a应该是for b in kwargs[a],因为a是键而不是字典。你的代码还有其他问题,但是……
- 因此,我发现可以使用:Class MyClass(object): def __init__(self, **kwargs): for key, value in kwargs.items(): val = value if isinstance(val, dict): val = MyClass(**val) setattr(self,key,val)初始化嵌套字典到kwargs。
- 如果你已经有了一本有关键字的字典,你可以这样传递你的论点:MyClass(group1={"property1": 100,"property2": 200}, group2={"property3": 100,"property4": 200})。