我需要帮助理解为什么返回值与我的预期不同。我正在使用cmd模块

时间:2011-11-13 23:00:34

标签: python cmd

我正在尝试使用两个文件。 menu.py具有program.py导入的菜单。

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()docs中定义cmdloop()作为在user即将返回时执行的方法,因此我认为它会将lilith的值返回为lilith并且然后打印no one,但它只打印{{1}}。

编辑:建议我不要使用全局变量。我正在阅读this以找出原因。

2 个答案:

答案 0 :(得分:2)

那是因为此处user的分配:

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

作用于var的本地实例。要影响全局var user,您需要添加:

global user

到该函数的顶部。虽然我不推荐它,因为通常有比使用全局变量更好的方法。

关于全局和python的一个注释。虽然您无法在没有global关键字的情况下为全局变量赋值,但您可以在没有它的情况下读取全局(和其他非本地)范围。这允许你制作闭包。

答案 1 :(得分:2)

cmd与此无关。 user = 'lilith'引入了一个新的本地绑定。要重新绑定全局名称,您需要执行以下操作:

global user
user = 'lilith'

另外,你应该避免使用全局变量。