参数数量无效(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.
我正在尝试创建二叉搜索树,但它给了我 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.