Мне нужна помощь в понимании того, почему возвращаемое значение отличается от того, что я ожидал. Я использую модуль cmd

#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'
  

Кроме того, вам следует избегать глобальных значений.