2012-06-26 6 views
-4

У меня проблема с объектом, который я создал, а затем использую в функции.Почему мой объект исчезает?

class environnement: 
    def __init__(self, n, dic={}, listr=[], listf=[]): 
     self.taille=n 
     self.reg=dict(dic) 
     self.raccess=listr 
     self.faccess=listf 

Сначала я создать среду, в моей функции compilProgram, а затем я использую compilInstruction с этим Environnement:

def compilProgram(fichierSortie, nbrRegDispo, AST): 
    DICOFUN={} 
    for elt in AST.children: 
     if elt.type=='fonctionDef': 
      DICOFUN[elt.leaf]=elt.children 
      continue 
     else : 
      pass 
    env=environnement(nbrRegDispo) 
    print(type(env)) 
    compteurLabel=0 
    for elt in AST.children: 
     if elt.type!='fonctionDef': 
      (env, compteurLabel)=compilInstruction(env, fichierSortie, elt, compteurLabel) 

Печать на compilProgram, чтобы проверить, что env, прежде чем я дать ему compilInstruction (потому что У меня проблема).

def compilInstruction(env, fichierSortie, instruction,compteurLabel): 
    print(type(env)) 
    envInterne=environnement(env.taille, env.reg, env.raccess, env.faccess) 
    ... 

Я стараюсь много другого способа скопировать env, но проблема, кажется, не от него. Вот что я получаю, когда я пытаюсь compilProgram на propers аргументы:

<class 'Environnement.environnement'> (this is the print from compilProgram) 
<class 'Environnement.environnement'> (this is the print from compilInstruction) 
<class 'NoneType'> (this again comes from the print in compilInstruction) 
... 
AttributeError: 'NoneType' object has no attribute 'taille' 

Почему печать в compilInstruction перспективе в два раза, и почему env исчезает между двумя отрезками?

+3

Не связанный с вами вопрос, но вы обязательно столкнетесь с этой проблемой: [«Наименьшее удивление» в Python: разрешимый аргумент по умолчанию] (http://stackoverflow.com/q/1132941/395760) – delnan

ответ

1

Вы вызываете более compilInstruction раз:

for elt in AST.children: 
    if elt.type!='fonctionDef': 
     (env, compteurLabel)=compilInstruction(env, fichierSortie, elt, compteurLabel) 

У вас есть более одного ELT в AST.children, который не «fonctionDef» (опечатка ??), так что вы вызываете более одного раза compilInstruction , Вот почему вы получаете более одного отпечатка. Возвращаемое значение compilInstruction присваивается env и compteurLabel, поэтому env заменяется на None.

+0

Хорошо, я понял это сейчас, я проверю свою функцию compilInstruction. Большое спасибо! – user1483213

+0

Большое спасибо, больше не видели ошибки в коде. Должно быть, слишком устал. В любом случае, спасибо!! – user1483213

3

У вас есть два оператора печати, что объясняет печать дважды.

Вы переписываете env с возвратом от вашего первого звонка до функции compilInstruction. Из этого следует, что эта функция возвращает значение None как первый элемент возвращаемого кортежа.

+0

Ну, У меня есть 3 вывода из всего лишь 2 в коде (я отредактировал мой вопрос, чтобы указать на него). – user1483213

+0

@ user1483213 Кстати, почему вы приняли новый ответ с той же информацией, что и этот? – Marcin

Смежные вопросы