参数数量无效(TypeError),尽管给出了准确的参数

Invalid numbers of args (TypeError), though exact args given

我正在尝试创建二叉搜索树,但它给了我 TypeError。我如何将第二个参数 (node) 作为对象本身传递给 insert(),因为第一个参数 (self) 始终是 BSTNode.[=18 的实例=]

# Binary Search Tree
# Create a BST and insert elements and print Inorder traversal


class BSTNode(object):
    def __init__(self, key, left=None, right=None):
        self.left = left
        self.right = right
        self.key = key

    @property
    def insert(self, node, key):
        if node is None:
            return BSTNode(key)
        elif key < node.key:
            node.left = insert(node.left, key)
        elif key > node.key:
            node.right = insert(node.right, key)
        return node

    @property
    def inorder(root):
        if root:
            inorder(root.left)
            print(root.key)
            inorder(root.right)

if __name__ == "__main__":
    bst = BSTNode(50)
    bst.insert(bst, 30)
    bst.insert(bst, 20)
    bst.insert(bst, 40)
    bst.insert(bst, 70)
    bst.insert(bst, 60)
    bst.insert(bst, 80)

    inorder(root)

无论我向 insert() 传递多少参数,上面的代码都会给出相同的错误:

Traceback (most recent call last):
  File "bst.py", line 31, in <module>
    bst.insert(root, 30)
TypeError: insert() takes exactly 3 arguments (1 given)

您不应在此处为 insert() 函数创建 @property(在本例中也不应为 inorder() 创建)。

属性应用于管理 class 和 getter 设置器和删除器的属性。 getter(您使用 @property 修饰创建并在通过 bst.insert 访问 属性 时调用)必须采用 单个 参数self。然后,它(通常)returns 分配给它的属性。

相反,像普通 method 一样使用它并添加元素而不装饰它,请注意我是如何将 self 添加到您的 insert() 调用中的:

 def insert(self, node, key):
    if node is None:
        return BSTNode(key)
    elif key < node.key:
        node.left = self.insert(node.left, key)
    elif key > node.key:
        node.right = self.insert(node.right, key)
    return node

现在您的插入工作正常并且 return 新节点对象:

bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>

发生这种情况的原因是因为 属性 的 (__get__) 函数在内部调用了您装饰为 getter 的函数 (insert) 但是单个参数 insert(instanceOfClass)

因为你定义了你的函数 insert() 有多个参数,当这个调用被调用时你会得到一个漂亮的小 TypeError.

@rohit varshney

原因:属性装饰器有 3 个输入参数(fget、fset、fdel)、文档字符串。

属性 装饰器的使用在这里是不合适的,因此是错误的。

修复:请删除上面的 @属性 插入 def.

装饰器教程: https://dzone.com/articles/python-201-decorators