Невозможно сослаться на переменную, созданную с помощью "vars () []" из словаря - PullRequest
1 голос
/ 28 марта 2019

Мне поручено создать систему управления запасами для магазина комиксов в качестве оценки школьного питона. В настоящее время у меня есть словарь, в котором есть названия комиксов и стандартные значения этих комиксов, импортированных из файла CSV;

comic_books =  {}

with open('data.csv', 'r+',  newline='') as csvfile:
    csvreader = csv.reader(csvfile)
    for row in csvreader:
        comic_books[row[0]] = int(row[1])

Одно из требований программы - обеспечить, чтобы пользователь мог видеть все комиксы сразу. Для этого я просто создал два виджета меток для каждого ключа в своем словаре, используя функцию vars() (наряду с некоторым форматированием, чтобы такие вещи, как пробелы в комических именах, не вызывали конфликтов);

itteration = 2

for item in comic_books:

    vars()[item.replace(" ", "") + "Stock"] = Label(main, text=item+":")
    vars()[item.replace(" ", "") + "Stock"].grid(column=1, row=itteration, padx=5)

    vars()[item.replace(" ", "") + "StockAmount"] = Label(main, text=comic_books[item])
    vars()[item.replace(" ", "") + "StockAmount"].grid(column=2, row=itteration, padx=5)
    itteration += 1

Я в итоге получил результат ниже, который работает как ожидалось:

image

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

for item in comic_books:
                vars()[item.replace(" ", "") + "StockAmount"].config(text=comic_books[item])

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

  File "C:\Users\XXX\Desktop\pythonAsessment2\test.py", line 114, in sellProcess
    vars()[item.replace(" ", "") + "Stock"].config(text=comic_books[item])
KeyError: 'Comic2Stock'

Спасибо!

1 Ответ

1 голос
/ 28 марта 2019

Я в растерянности относительно того, что делать в данный момент.

Первое, что нужно сделать, это прекратить использовать vars() для создания динамических переменных. Это почти никогда не является хорошей идеей, поскольку делает ваш код излишне сложным, трудным для написания и трудным для отладки.

Вместо этого используйте словарь, если вы хотите ссылаться на отдельные элементы по имени. Это будет выглядеть примерно так:

labels = {}
for item in comic_books:
    key= "{} Stock".format(item)
    labels[key] = Label(main, text=item+":")
    labels[key].grid(column=1, row=itteration, padx=5)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...