图表类:TypeError:__init__() 接受 1 个位置参数,但给出了 3 个
Posted
技术标签:
【中文标题】图表类:TypeError:__init__() 接受 1 个位置参数,但给出了 3 个【英文标题】:Graph Class: TypeError: __init__() takes 1 positional argument but 3 were given 【发布时间】:2021-07-30 20:15:05 【问题描述】:class _Edges(defaultdict):
def __missing__(self, vertex):
self.setdefault(vertex, True)
def __delitem__(self, dst):
self[dst] = False
def del_vertex(self, dst):
super().__delitem__(dst)
class Graph(defaultdict):
def __init__(self):
super().__init__(_Edges)
def copy(self):
return super().__copy__()
我正在尝试编写一个制作图表的类,但是当我尝试调用复制函数时出现错误。我应该写自己的__copy__
吗?我想我可以使用defaultdict
的副本来复制图表。
复制类应该通过调用graph.copy()
来创建图形的精确副本
例如。
g = Graph()
g['a']['b'] = 5
x = g.copy()
这将制作一个精确的副本,但我得到了上述错误
【问题讨论】:
对于初学者来说,你的__missing__
实现是错误的......它总是返回 None
这可能不是你想要的。
请提供minimal reproducible example。
可能会更好??调用super().copy()
而不是直接调用魔术方法。
我这样做了,所以如果我尝试制作一个未加权的边缘,它的值会是 true。只是为了表明边缘存在但它没有重量,
我尝试了 super.copy() 并且得到了同样的错误 return super().copy() TypeError: __init__() 需要 1 个位置参数,但给出了 3 个
【参考方案1】:
根据测试,我相当确定defaultdict
的__copy__
实现将在Graph
上调用__init__
,并带有至少两个参数:
default_factory
;和
正在复制的对象。
要解决这个问题,您可以将 Graph
类修改为:
class Graph(defaultdict):
def __init__(self, *args):
if len(args) == 0:
super().__init__(_Edges)
else:
super().__init__(*args)
因此,如果它作为复制操作的一部分被调用(当args
包含一个值时),所有值都会简单地传递给defaultdict
实现;但如果args
为空,则仅使用default_factory
参数调用defaultdict
实现。使用此实现,您可能不需要提供copy
或__copy__
,因为默认为defaultdict
提供的就足够了。
【讨论】:
以上是关于图表类:TypeError:__init__() 接受 1 个位置参数,但给出了 3 个的主要内容,如果未能解决你的问题,请参考以下文章
Python-TypeError: object() takes no parameters
Pytho连接数据库TypeError: __init__() takes 1 positional argument but 6 were?
TypeError: __init__() 得到了一个意外的关键字参数“评分”
TypeError: __init__() 接受 2 个位置参数,但给出了 4 个