I'm creating the basic tree which creates nodes and their child. But getting the error when using the print() statement i.e. __ str __( ) to print out the tree layout in the below code.
class TreeNode:
def __init__(self,data,children = []):
self.data = data
self.children = children
def __str__(self,level=0):
ret = " " * level str(self.data) '\n'
for child in self.children:
ret = child.__str__(level 1)
return ret
# adding the children to the tree node
def addchildren(self,TreeNode):
self.children.append(TreeNode.data)
drinks = TreeNode('Drinks',[])
cold = TreeNode('Cold',[])
hot = TreeNode('Hot',[])
cola = TreeNode('Cola',[])
cappucino = TreeNode('Cappucino',[])
drinks.addchildren(cold)
drinks.addchildren(hot)
cold.addchildren(cola)
hot.addchildren(cappucino)
print(drinks)
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_944/4195955341.py in <module>
----> 1 print(drinks)
~\AppData\Local\Temp/ipykernel_944/3676504849.py in __str__(self, level)
8 ret = " " * level str(self.data) '\n'
9 for child in self.children:
---> 10 ret = child.__str__(level 1)
11
12 return ret
TypeError: expected 0 arguments, got 1
Why it's throwing this TypeError? And what is the solution? I'm expecting this:
Drinks
Cold
Cola
Hot
Cappucino
And one more thing, please also explain the def __str__(self,level=0): method especially child.__str__(level_1) cause I have borrowed this print statement.
CodePudding user response:
Your addchildren method is broken, it should add TreeNode to self.children, not TreeNode.data:
def addchildren(self,TreeNode):
self.children.append(TreeNode)
The TypeError is caused by ret = child.__str__(level 1), it is meant to recursively print the child node if each child in self.children is also an instance of class TreeNode. But it failed and caused the TypeError since TreeNode.data was added as one of the children.
As the error message TypeError: expected 0 arguments, got 1 indicated, it tried to invoke __str__ method for TreeNode.data, an instance of the build-in class str, which by default does not take any parameter. Because the __str__ method for user-defined class TreeNode is overridden, but the build-in str class not.
So it is the same as invoking 'Cold'.__str__(level 1), which does not expect any arguments by default.
object.str(self) Called by str(object) and the built-in functions format() and print() to compute the “informal” or nicely printable string representation of an object. The return value must be a string object. -- Python3 Reference
Notice that self does not count as an argument (at least not in the error message), it is just a convention to have a reference to the object that each class method need to place as the first one in the argument list.
