#python #cmd
#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()
определен в документах как метод, который выполняется, когда cmdloop()
собирается вернуться, поэтому я думал, что он вернет значение user
as lilith
, а затем lilith
будет напечатано, но он просто печатает no one
.
Редактировать: Было рекомендовано, чтобы я не использовал глобальные значения. Я читаю это, чтобы выяснить, почему.
Ответ №1:
Это потому, что назначение user
здесь:
def postloop(self):
user = 'lilith'
return user
действует на локальный экземпляр var. Чтобы повлиять на глобальную переменную user
, вам нужно будет добавить:
global user
в верхней части этой функции. Хотя я бы не рекомендовал это, поскольку обычно есть способы сделать что-то получше, чем использовать глобальные значения.
Одно замечание о глобальных файлах и python. Хотя вы не можете присвоить значение глобальной переменной без global
ключевого слова, вы можете читать глобальные (и другие нелокальные) области без него. Это позволяет вам создавать замыкания.
Ответ №2:
cmd
не имеет к этому никакого отношения. user = 'lilith'
вводит новую локальную привязку. Чтобы повторно привязать глобальное имя, вам нужно выполнить:
global user
user = 'lilith'
Кроме того, вам следует избегать глобальных значений.