возникли проблемы при записи списка словарей в виде строки - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь написать программу, которая создает адресную книгу с именами контактов, электронными адресами, телефонными номерами и т. Д. Я сохраняю каждый контакт в виде словаря, а затем помещаю каждого человека (словарь) в глобальный список.Затем я преобразую список в строку, используя repr(), и записываю ее в файл.Когда я пытаюсь перезагрузить список и написать, что он содержит, я получаю список пустых словарей.Пожалуйста, помогите мне разобраться в чем дело.

Вот мой код:

list = []
listfile = 'phonebook.txt'

class bookEntry(dict):
    total = 0

    def __init__(self):
        bookEntry.total += 1
        self.d = {}

    def __del__(self):
        bookEntry.total -= 1

class Person(bookEntry):
    def __init__(self, n):
        bookEntry.__init__(self)
        self.n = n
        print '%s has been created' % (self.n)

    def addnewperson(self, n, e = '', ph = '', note = ''):
        f = file(listfile, 'w')

        self.d['name'] = n
        self.d['email'] = e
        self.d['phone'] = ph
        self.d['note'] = note

        list.append(self)
        listStr = repr(list)
        f.write(listStr)

        f.close()

Я запускаю программу с функцией startup():

def startup():
    aor = raw_input('Hello! Would you like to add an entry or retrieve one?')
    if aor == 'add':
        info = raw_input('Would you like to add a person or a company?')
        if info == 'person':
            n = raw_input('Please enter this persons name:')
            e = raw_input('Please enter this persons email address:')
            ph = raw_input('Please enter this persons phone number:')
            note = raw_input('Please add any notes if applicable:')

            X = Person(n)
            X.addnewperson(n, e, ph, note)
startup()

Iдобавьте эти ответы к подсказкам:

'''
    Hello! Would you like to add an entry or retrieve one?add
    Would you like to add a person or a company?person
    Please enter this persons name:Pig
    Please enter this persons email address:pig@brickhouse.com
    Please enter this persons phone number:333-333-3333
    Please add any notes if applicable:one of three
    Pig has been created
'''

Когда я открываю phonebook.txt, вот что я вижу:

[{}]

Почему возвращаются пустые словари?

Ответы [ 3 ]

1 голос
/ 09 января 2012

Вы наследуете от dict, но храните все элементы в элементе d. Следовательно, repr дает вам строку, представляющую пустой dict. Если вы хотите использовать bookEntry в качестве dict, введите информацию с помощью

self['name'] = n

вместо

self.d['name'] = n

(Но на самом деле, вы не должны наследовать от dict здесь. Также, пожалуйста, не используйте list в качестве идентификатора, это имя встроенного.)

1 голос
/ 09 января 2012

Вы должны сохранить self.d вместо self:

  alist.append(self.d)
  listStr = repr(alist)
  f.write(listStr)

Кстати, не используйте список в качестве имени переменной, вы перезаписываете ключевое слово list

0 голосов
/ 09 января 2012

Ваша проблема в том, что словарь X.d отличается от словаря, из которого наследуется bookEntry. Поэтому repr (X) не показывает X.d

Решением может быть переопределение repr в BookEntry:

, например

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