无效的args数(TypeError),尽管给出了精确的args

时间:2015-11-11 13:34:06

标签: python oop binary-search-tree

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

# 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)

2 个答案:

答案 0 :(得分:2)

您不应在此处为@property功能创建insert()(在这种情况下,inorder()也不能创建getter

应使用属性来管理具有getter setter和deleters的类的属性。 @property(使用bst.insert修饰创建并在通过self访问属性时调用)必须使用参数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 来电中:

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

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

__get__

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

因为您已使用多个参数定义了函数TypeError,所以在进行此调用时,您将获得一个不错的小foldl/4

答案 1 :(得分:0)

@rohit varshney

原因:属性装饰器有3个输入args(fget,fset,fdel),doc string。

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

修复:请删除上面的@property插入def。

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