Программа Python обрабатывает словарь как строку - PullRequest
0 голосов
/ 26 сентября 2011

Я создал словарь и заполнил его из файла, например:

filedusers = {} # cheap way to keep track of users, not for production
FILE = open(r"G:\School\CS442\users.txt", "r")
filedusers = ast.literal_eval("\"{" + FILE.readline().strip() + "}\"")
FILE.close()

потом я провёл тест, например:

если не filedusers.get (слова [0]):

где words[0] - строка для имени пользователя, но я получаю следующую ошибку:

Объект 'str' не имеет атрибута 'get'

но я уже убедился, что после FILE.close() у меня был словарь, и в нем были правильные значения.

Есть идеи, что происходит?

Ответы [ 3 ]

5 голосов
/ 26 сентября 2011

literal_eval принимает строку и преобразует ее в объект python.Итак, верно следующее:

ast.literal_eval('{"a" : 1}')
>> {'a' : 1}

Однако вы добавляете некоторые ненужные цитаты.Если бы ваш файл просто содержал пустой словарь ({}), то создаваемая вами строка выглядела бы так:

ast.literal_eval('"{}"') # The quotes that are here make it return the string "{}"
>> '{}'

Итак, решение было бы изменить строку на ...

ast.literal_eval("{" + FILE.readline().strip() + "}")

... или ...

ast.literal_eval(FILE.readline().strip())

.. в зависимости от формата файла.В противном случае literal_eval видит вашу строку как АКТУАЛЬНУЮ строку из-за кавычек.

3 голосов
/ 26 сентября 2011
>>> import ast
>>> username = "asd: '123'"
>>> filedusers = ast.literal_eval("\"{" + username + "}\"")
>>> print filedusers, type(filedusers)
{asd} <type 'str'>

У вас нет словаря, он просто выглядит как один. У вас есть строка.

1 голос
/ 26 сентября 2011

Python динамически типизирован: он не требует, чтобы вы определяли переменные как определенный тип. И это позволяет вам определять переменные неявно. Вы определяете filedusers как словарь, а затем переопределяете как строку, присваивая ей результат ast.literal_eval.

РЕДАКТИРОВАТЬ: Вам нужно удалить эти цитаты. ast.literal_eval('"{}"') оценивается как строка. ast.literal_eval('{}') соответствует словарю.

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