gpt4 book ai didi

python - 尽管给出了精确的参数,但参数数量无效(TypeError)

转载 作者:行者123 更新时间:2023-12-01 04:21:17 25 4
gpt4 key购买 nike

我正在尝试创建二叉搜索树,但它给了我一个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)

最佳答案

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

属性应该用于通过 getters、setters 和deleters 来管理类的属性。 getter(使用 @property 装饰创建并在通过 bst.insert 访问属性时调用)必须采用单个 参数self。然后,它(通常)返回分配给它的属性。

相反,请像普通方法一样使用它,并添加元素而不对其进行修饰,请注意我如何将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__) 函数在内部调用您装饰为 getter 但具有单个参数的函数 (insert) 插入(instanceOfClass)

因为您已经使用多个参数定义了函数insert(),所以当进行此调用时,您将得到一个漂亮的小TypeError

关于python - 尽管给出了精确的参数,但参数数量无效(TypeError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33651660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com