Pourquoi suis-je une “ instance n'a pas d'attribut '__getitem__' ” erreur?
Voici le code:
class BinaryTree:
def __init__(self,rootObj):
self.key = rootObj
self.left = None
self.right = None
root = [self.key, self.left, self.right]
def getRootVal(root):
return root[0]
def setRootVal(newVal):
root[0] = newVal
def getLeftChild(root):
return root[1]
def getRightChild(root):
return root[2]
def insertLeft(self,newNode):
if self.left == None:
self.left = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.left = self.left
self.left = t
def insertRight(self,newNode):
if self.right == None:
self.right = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.right = self.right
self.right = t
def buildParseTree(fpexp):
fplist = fpexp.split()
pStack = Stack()
eTree = BinaryTree('')
pStack.push(eTree)
currentTree = eTree
for i in fplist:
if i == '(':
currentTree.insertLeft('')
pStack.push(currentTree)
currentTree = currentTree.getLeftChild()
elif i not in '+-*/)':
currentTree.setRootVal(eval(i))
parent = pStack.pop()
currentTree = parent
elif i in '+-*/':
currentTree.setRootVal(i)
currentTree.insertRight('')
pStack.push(currentTree)
currentTree = currentTree.getRightChild()
elif i == ')':
currentTree = pStack.pop()
else:
print "error: I don't recognize " + i
return eTree
def postorder(tree):
if tree != None:
postorder(tree.getLeftChild())
postorder(tree.getRightChild())
print tree.getRootVal()
def preorder(self):
print self.key
if self.left:
self.left.preorder()
if self.right:
self.right.preorder()
def inorder(tree):
if tree != None:
inorder(tree.getLeftChild())
print tree.getRootVal()
inorder(tree.getRightChild())
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def main():
parseData = raw_input( "Please enter the problem you wished parsed.(NOTE: problem must have parenthesis to seperate each binary grouping and must be spaced out.) " )
tree = buildParseTree(parseData)
print( "The post order is: ", + postorder(tree))
print( "The post order is: ", + postorder(tree))
print( "The post order is: ", + preorder(tree))
print( "The post order is: ", + inorder(tree))
main()
Et voici l'erreur:
Veuillez saisir le problème que vous avez voulu analysée.(REMARQUE: le problème doit avoir entre parenthèses pour séparer chaque binaire de regroupement et doivent être espacées.) ( 1 + 2 ) Traceback (most recent call last): Fichier "C:\Users\Kevin\Desktop\Python Choses\Affectation 11\parseTree.py", la ligne 108, main() Fichier "C:\Users\Kevin\Desktop\Python Choses\Affectation 11\parseTree.py", ligne 102, dans la principale arbre = buildParseTree(parseData) Fichier "C:\Users\Kevin\Desktop\Python Choses\Affectation 11\parseTree.py", ligne 46, dans buildParseTree currentTree = currentTree.getLeftChild() Fichier "C:\Users\Kevin\Desktop\Python Choses\Affectation 11\parseTree.py", la ligne 15, dans getLeftChild de retour de la racine[1] AttributeError: BinaryTree instance n'a pas d'attribut '__getitem__'
besoin de corriger la mise en forme.
OriginalL'auteur Kevin Yusko | 2010-03-29
Vous devez vous connecter pour publier un commentaire.
Parce que vous avez déclaré vos méthodes de mal:
Permet d'avoir un coup d'oeil ce qui se passe si vous appelez
tree.getRootVal()
..getRootVal()
est déclaré ainsi:Comme vous le savez probablement, le premier paramètre passé à une méthode est toujours l'instance et il est fourni implicitement. Donc, fondamentalement, vous essayez de traiter une instance de
BinaryTree
comme une séquence(root[0]
).Vous devez spécifier cette façon:
Le premier paramètre à une méthode objets n'ont pas à être appelé
self
. Mais contribue à faire de cette façon afin d'éviter les erreurs comme vous l'avez fait.Intéressant que vous avez déclaré
insertLeft
etinsertRight
correctement 😉OriginalL'auteur Felix Kling
Votre premier problème, c'est que
root
devrait êtreself.root
.Votre deuxième problème, c'est ici:
Vous êtes à la redéfinition de la racine avec un sens nouveau.
OriginalL'auteur Mark Byers
Comme PreludeAndFugue dit, vous devez corriger la mise en forme. Mais de ce que j'ai pu rassembler, il y a au moins une erreur dans vos méthodes de la classe dans BinaryTree: la plupart d'entre eux ne prennent même pas
self
en tant que paramètre. Correctif et peut-être vous peut-être un peu mieux.Mais maintenant im obtenir un autre problème. Dans mon postorder(arbre) il trouve le poste de commande d'un arbre binaire donné, MAIS im obtenir une erreur le long des lignes de: Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> main() du Fichier "C:\Users\Kevin\Desktop\Python Choses\Affectation 11\parseTree.py", la ligne 106, dans les principales print( "Le poste de commande est: ", + postorder(arbre)) TypeError: mauvais type d'opérande pour unaire +: 'NoneType' des idées? Condidering la case au début de l'année je ne vois pas pourquoi sa l'obtention d'un 'NoneType' erreur.
Je pense que vous êtes en train d'imprimer une chaîne, puis la valeur d'une variable, oui? Je crois que je vois la ligne où l'erreur est survenue. Je suggère d'enlever le "+". En python, vous pouvez simplement dire: <code>print "La valeur de cinq ans est de:", 5</code>, et il va fonctionner comme vous le souhaitez. Si vous jetez un "+" là, c'est une mauvaise syntaxe. Si vous voulez vraiment utiliser un "+", do <code>print "La valeur de cinq ans est de:" + str(5)<code>. L'opérateur "+" est utilisé pour concaténer des chaînes de caractères et est donc mal utilisées dans votre exemple.
PS: à l'avenir, merci d'ajouter un commentaire dans le code en annotant le numéro de la ligne. Il facilite le suivi de votre code à la ligne d'erreur exact
je vous remercie bien, monsieur...et je vais
OriginalL'auteur inspectorG4dget