NameError: имя '' не определено, пытается создать приложение CLI списка дел - PullRequest
1 голос
/ 03 мая 2019

Итак, как следует из названия, я пытаюсь создать приложение CLI с списком дел, и я получаю эту ошибку.(NameError: name 'loaded_uinput' is not defined)

Когда я устанавливаю загруженную_uinput в глобальную переменную, это дает мне эту ошибку, но если я не делаю, это дает мне такую: UnboundLocalError: local variable 'loaded_uinput' referenced before assignment

Я былпытаясь весь день исследовать, что я делаю неправильно, но, за исключением того, что это плохо написанный код (сейчас я планирую его очень скоро реорганизовать), я не могу найти его: /


userlist = []
filename = "userdata.p"

def maininput():
    while True:
        #Selecting if user wants to read or write the list, and or exit
        init_conf = input("Would you like to read or write your list? (read | write | exit)")
        #Printing the list
        if init_conf == "read":
            pickle_in = open(filename, "rb")
            loaded_uinput = pickle.load(pickle_in, encoding='bytes')
            pickle_in.close()
            print(*loaded_uinput, sep="\n")
        #Customizing the list
        elif init_conf == "write":
            uinput = input("What would you like to add to your list?")
            userlist.append("-" + uinput)
            pickle_out = open(filename, "ab")
            pickle.dump(userlist, pickle_out)
            pickle_out.close()
            print(*loaded_uinput, sep="\n")
        elif init_conf == "exit":
            break

maininput()

Я просто хочу, чтобы это работало без ошибок, ха-ха, даже не понимаю, как это говорит о том, что оно не определено, когда на самом деле кажется, что это так: / Я хочу написать что-то и сохранить это в userdata.p

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Не определяйте loaded_uinput как глобальную переменную вне функции.UnboundLocalError появляется, если вы пытаетесь использовать loaded_uinput до его определения, что может произойти, если init_conf == "write" равно True в самой первой итерации цикла while.То есть, если вы наберете "write" в самый первый раз, loaded_uinput не будет определен при попытке использовать его для распечатки.

1 голос
/ 03 мая 2019

Ошибка возникает из-за того, что вы пытаетесь получить доступ к переменной loaded_uinput, прежде чем присваивать ей какое-либо значение.

Когда цикл запускается в первый раз и вводится команда «запись», цикл получает входные данные в uinput и сохраняет их в файл, но пытается напечатать print(*loaded_uinput, sep="\n"), который еще не введенназначены.Его следует изменить на

print(*uinput)

open(filename, "ab"), чтобы заменить содержимое файла вместо добавления к нему.

open(filename, "wb")

Проверьте этот рабочий код:

import pickle
userlist = []
filename = "userdata.p"

def maininput():
    while True:
        #Selecting if user wants to read or write the list, and or exit
        init_conf = input("Would you like to read or write your list? (read | write | exit)")
        #Printing the list
        if init_conf == "read":
            pickle_in = open(filename, "rb")
            loaded_uinput = pickle.load(pickle_in)
            pickle_in.close()
            print(*loaded_uinput, sep="\n")
        #Customizing the list
        elif init_conf == "write":
            uinput = input("What would you like to add to your list?")
            userlist.append("-" + uinput)
            pickle_out = open(filename, "wb")
            pickle.dump(userlist, pickle_out)
            pickle_out.close()
            print(*uinput)
        elif init_conf == "exit":
            break

maininput()

Рабочий пример здесь: https://repl.it/repls/VapidDescriptiveMiddleware

1 голос
/ 03 мая 2019

Вам просто нужно определить переменную перед циклом. Он создается только в области видимости блока if, а не когда вы попадаете в блок elif, где вы пытаетесь получить к нему доступ. Вы можете установить его в пустой список, если хотите.

userlist = []
filename = "userdata.p"

def maininput():
    loaded_uinput = []
    while True:
        #Selecting if user wants to read or write the list, and or exit
        init_conf = input("Would you like to read or write your list? (read | write | exit)")
        #Printing the list
        if init_conf == "read":
            pickle_in = open(filename, "rb")
            loaded_uinput = pickle.load(pickle_in, encoding='bytes')
            pickle_in.close()
            print(*loaded_uinput, sep="\n")
        #Customizing the list
        elif init_conf == "write":
            uinput = input("What would you like to add to your list?")
            userlist.append("-" + uinput)
            pickle_out = open(filename, "ab")
            pickle.dump(userlist, pickle_out)
            pickle_out.close()
            print(*loaded_uinput, sep="\n")
        elif init_conf == "exit":
            break

maininput()
...