图表类: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 个

TypeError: __init__() 接受 1 个位置参数,但给出了 3 个

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个