UnboundLocalError: локальная переменная 'text_in_use', на которую ссылаются до назначения - PullRequest
0 голосов
/ 30 сентября 2019

Я могу установить переменную и распечатать ее сразу после выбора, если выбор == 1. Но если выбор == 2, я не могу распечатать его, текст, который был установлен, я получаю ошибку.

(UnboundLocalError:локальная переменная 'text_in_use', на которую ссылается перед присваиванием)

Как это исправить?

text_in_use = ''
encrypt_key = ''

def menu():
    choice = int(input("""1: Input text to work with
2: Print the current text
3: Encrypt the current text
4: Decrypt the current text
5: Exit
Enter Choice: """))

    if choice == 1:
       text_in_use = str(input("Enter Text: ")).upper()
       print("Text to use was set to:", text_in_use)
       menu()
    elif choice == 2:
        print(text_in_use) #this is where i get the error <-----
        menu()
    elif choice == 3:
        print("3")
        menu()
    elif choice == 4:
        #decrypt()
        print("4")
        menu()
    elif choice == 5:
        #exit()
        print("5")
        menu()

menu()

я просто хочу напечатать текст, который был установлен.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы должны пометить переменную text_in_use как глобальную. Вы ссылаетесь на него в функции из внешней области видимости

def menu():
    global text_in_use
    choice = int(input("your_text"))

   #rest of code
0 голосов
/ 01 октября 2019

- Привет, Линус,

Ваша переменная

text_in_use

устанавливается только в том случае, если соблюдено ваше первое условие. Поэтому, если ваши коды пропустят это условие и перейдут к:

elif choice == 2

, переменная еще не установлена.

Поскольку функция рекурсивно вызывает себя после каждой опции, вы также можетеНе добавляйте переменную перед первым предложением, как я изначально предлагал.

Поэтому я изменяю свой ответ на следующее:

На этом этапе яТакже хотелось бы добавить, что функция без выхода не может быть тем, что вы в конечном итоге хотите использовать. Поэтому я закомментировал рекурсивный вызов в варианте 5.

Я предлагаю использовать простой класс:

class Menu:
  def __init__(self):
    self.text_in_use = ''
    self.encrypt_key = ''

    self.build_menu()

  def build_menu(self):

    choice = int(input(
      """
      1: Input text to work with
      2: Print the current text
      3: Encrypt the current text
      4: Decrypt the current text
      5: Exit

      Enter Choice: 
      """
    ))

    if choice == 1:
      self.text_in_use = str(input("Enter Text: ")).upper()
      print("Text to use was set to:", self.text_in_use)
      self.build_menu()
    elif choice == 2:
      print(self.text_in_use)
      self.build_menu()
    elif choice == 3:
      print("3")
      self.build_menu()
    elif choice == 4:
      #decrypt()
      print("4")
      self.build_menu()
    elif choice == 5:
      #exit()
      print("5")
      # self.build_menu() do not call this again so it actually exits.

Menu()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...