-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この環境で使用します。

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何であるかをチェックすることです(私は問題を抱えているため)。envcompilInstruction

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

私は他の多くの方法でコピーを試みましenvたが、問題はそれが原因ではないようです。compilProgramこれが私が適切な議論をしようとしたときに私が得るものです:

<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が2回実行さenvれ、2回の実行の間に消えるのですか?

4

2 に答える 2

3

2回の印刷を説明する2つのprintステートメントがあります。

env関数への最初の呼び出しからの戻りで上書きしていcompilInstructionます。したがって、その関数は、None返すタプルの最初の要素として値を返します。

于 2012-06-26T16:17:03.467 に答える
1

あなたはcompilInstruction複数回電話をかけています:

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

AST.childrenに「fonctionDef」(タイプミス??)ではない複数のeltがあるため、compilInstruction複数回呼び出しています。そのため、そこから複数のプリントを取得します。compilInstructionの戻り値はとに割り当てられているenvためcompteurLabelenvNoneで上書きされます。

于 2012-06-26T16:36:32.777 に答える