Определение функции main_menu для вызова из других методов внутри класса в Python - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть класс с несколькими методами для назначения атрибутов из пользовательского ввода и тремя методами, которые добавляют, удаляют или обновляют вложенный словарь с помощью ввода.Я хотел бы добавить функцию main_menu, чтобы пользователь мог получить доступ к методам добавления, удаления и обновления, а затем выбрать либо продолжить добавление / удаление / обновление словаря, либо вернуться в главное меню.

Когда я пытался сделать функцию main_menu, я получаю NameError: имя 'команда' не определено.Программа будет проходить, как и ожидалось, если main_menu не является функцией, но как только я попытался превратить ее в функцию, я получаю сообщение об ошибке.Я пробовал разные уровни отступов, но я новичок в Python и не знаю, что еще попробовать.

class MyClass:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.z = 0

    def get_x(self):
        #code to get x from user input
    def get_y(self):
        #code to get y from user
    def get_z(self):
        #code to get z from user

    def add_info(self):
        store_info = {}
        id = 0
        while command = '1':
            new_info = {}
            new_id = len(store_info) + 1
            store_info[new_id] = new_info

            x = h.get_x()
            new_info['x'] = x
            y = h.get_y()
            new_info['y'] = y
            z = h.get_z()
            new_info['z'] = z

            print('Your info has been updated.\n', store_info)
            choice = input('To add more info, type 1. To return to the main menu, type 2')
            if choice == '1':
                continue
            elif choice == '2':
                 main_menu()
            else:
                print('The End')
                break

    def delete_info(self):
        #code to delete, with an option at the end to return to main_menu

    def update_info(self):
        #code to update, with option for main_menu

def main_menu():
    main_menu_option = """Type 1 to add.
Type 2 to delete.
Type 3 to update.
Type any other key to quit.\n"""

    h = MyClass()
    command = input(main_menu_option)
    if command == '1':
        h.add_info()
    elif command == '2':
        h.delete_info()
    elif command == '3':
        h.update_info()
    else:
        print('Good bye.')

main_menu()

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

1 Ответ

0 голосов
/ 06 февраля 2019

В Python методы / функции имеют доступ только к переменным в своей области видимости или в родительских областях.Например:

command = 1  # A

def foo():
    print(command)

def bar():
    command = 2  # B
    print(command)

foo()
bar()
print(command)

выводит 1, затем 2, а затем 1.Это работает, потому что когда мы вызываем foo, python просматривает локальные переменные и понимает, что там нет переменной command, поэтому он смотрит на область видимости выше и видит переменную command в метке A. Затем, когда мы вызываем bar() мы добавляем переменную с именем command (метка B) к локальным переменным bar и затем выводим это, заметим, что python не смотрит на глобальные переменные здесь, поэтому он печатает 2 без изменения начального значения command переменная (метка A), как мы можем видеть, когда мы наконец-то print(command) в конце скрипта.

Именно из-за этого ваша программа терпит неудачу, ваш add_info метод пытается получить доступ кпеременная с именем command, однако ее локальная переменная или глобальная область не существует.Для решения этой проблемы можно добавить command к локальным переменным add_info, передав его в качестве аргумента методу из main_menu.

# in main_menu
if command == '1':
    h.add_info(command)

# in add_info
def add_info(self, command):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...