2011-11-13 8 views
0

私は2つのファイルを使用しようとしています。 menu.pyには、program.pyがインポートするメニューがあります。私は期待値と戻り値が異なる理由を理解する助けが必要です。私はcmdモジュールを使用しています

menu.py:

import cmd,sys 

user = 'no one' 

class loginMenu(cmd.Cmd): 
    def postloop(self): 
     user = 'lilith' 
     return user 
    intro="""login menu""" 
    def do_smtoggle(self,person): 
     return True 

    def do_quit(self,person): 
     sys.exit() 

class storeMenu(cmd.Cmd): 
    intro="""store menu""" 
    def do_whoami(self,person): 
     print 'storemenu ' + user 
    def do_quit(self,person): 
     quit = True 
     return quit 

program.py

from menu import * 
import cmd,sys 

lm = loginMenu() 
sm = storeMenu() 

while True: 
    lm.cmdloop() 
    print user 
    sm.cmdloop() 

私はprogram.pyがprint userことを得るとき、それはlilithを印刷することを期待ではなく、それはno oneを印刷します。どうしてこれなの? postloop()cmdloop()がので、私はそれがlilithとしてuserの値を返すだろうと思った戻りしようとすると、その後lilithが印刷されるが、それは単にno oneを印刷するときに実行される方法としてdocsに定義されています。

編集:グローバルを使用しないことをお勧めしました。私は理由を調べるためにthisを読んでいます。

def postloop(self): 
    user = 'lilith' 
    return user 

VARのローカルインスタンスに作用している:ここuserへの割り当てがあるためだ

答えて

2

。その関数の先頭に

global user 

:グローバルVAR userに影響を与えるために、あなたが追加する必要があります。私はそれをお勧めしませんが、一般的にグローバルを使うよりも良いことがあるからです。

グローバルとPythonについての注意。 globalキーワードを使用せずにグローバル変数に値を割り当てることはできませんが、グローバル(および他の非ローカル)スコープを読み取ることはできません。これにより、閉鎖を行うことができます。

2

cmdはこれとは関係ありません。 user = 'lilith'は新しいローカルバインディングを導入します。グローバル名を再バインドするには、次の操作を実行する必要があります。

また、グローバルを避ける必要があります。

関連する問題