为什么这个错误说我给函数两个参数?

时间:2015-07-24 21:39:20

标签: python

我定义了一个图表类,它具有获取节点名称并将名称和节点添加到字典的功能。当我运行程序时,我在底部收到错误。为什么它认为我给它两个论点?

class Graph:

    def __init__(self):
        self.node_list = {}
        self.number = 0

    def node(node_name):
        if node_name in self.node_list.keys:
            return node_list[node_name]
        else:
            node_list[node_name] = Node()
    ...

def PrefixTrieConstruction(patterns):
    trie = Graph()
    trie.node('root')

for pattern in patterns:
    currentNode = trie.node('root')
    for symbol in pattern:
        for daughter in currentNode.daughters:
            if daughter.label == symbol:
                currentNode = daughter
                break
        else:
            node_name = Trie.name_node()
            Trie.node(node_name)
            Trie.edge(currentNode, node_name, symbol)
            currentNode = node_name
return Trie



Traceback (most recent call last):
  File "PythonProject2.3.py", line 168, in <module>
    main()
  File "PythonProject2.3.py", line 163, in main
    TrieMatching(text, PrefixTrieConstruction(patterns))
  File "PythonProject2.3.py", line 68, in PrefixTrieConstruction
    trie.node('root')
TypeError: node() takes 1 positional argument but 2 were given

3 个答案:

答案 0 :(得分:4)

您遗失self

def node(self,node_name):

self指的是您正在调用方法的实例,因此您已经传递了实例,因此传递'root'显然会给出您看到的错误。

trie.node('root')基本上正在执行Graph.node(trie,"root"),因此您将两个args传递给一个方法,该方法需要一个,方法中的node_name被解释为实例'root'是一个额外的参数,除非你使用静态或类方法,你的方法的第一个arg应该始终是self,它可以是任何名称,但几乎每个python程序员按惯例使用self来引用实例

difference-between-class-and-instance-methods

what-is-the-difference-between-staticmethod-and-classmethod-in-python

what-is-the-purpose-of-self-in-python

答案 1 :(得分:2)

这很简单! 函数node只接受一个参数,但位于一个类中。给定隐式类实例和您的参数,这是2个参数。要解决此问题,您可以将功能编辑为

     def node(self,node_name):

答案 2 :(得分:1)

在python中,方法的第一个参数始终是调用方法的对象。按惯例,此变量称为self,但没有规则说这必须是这种情况。所以当你写:

def node(node_name):

node_name被解释为“自”变量,函数的预期用法是:

trie.node() #within this call, trie is bound to node_name

所以当你写:

trie.node('root')

trie绑定到node_name'root'是一个额外的参数,导致错误。

要获得预期的行为,只需声明self变量:

def node(self, node_name):