Сохраняет только одну запись вместо добавления в словарь - PullRequest
1 голос
/ 11 апреля 2011

Я хочу взять имя человека и его номер телефона у конечного пользователя и добавить в словарь.Я начал с пустого словаря.

После того, как первый пользователь введет данные, программа сообщит, что добавлена ​​новая запись, и отобразит содержимое внутри обновленного словаря.Пока все работает нормально.

Когда второй пользователь вводит данные, он должен делать то же самое:

  1. Скажем, добавлена ​​новая запись
  2. Отображать все всловарное значение, ввод первого пользователя и второго пользователя.Но это не работает, как ожидалось.Он показывает только ввод второго пользователя, но не ввод первого.

Может кто-нибудь сказать, почему это не удается добавить к существующим данным?Я вижу только одну запись каждый раз (кто бы ни был последним).

Вот программа:

class phonebook:
    allphones = {} # Empty dictionary

    def __init__ (self, name, phone):
        self.pername = name
        self.perphone = phone

    def adddata(self):
        phonebook.allphones[self.pername] = self.perphone # append to the dictionary
        print ('A new phone book entry added - {0}:{1}'.format(self.pername, self.perphone)) # confirm the input
        print (phonebook.allphones) # display what is inside the phonebook  
name = input('Type person\'s name --> ')
phone = input('Type phone\'s name --> ')
adding = phonebook(name, phone)
adding.adddata()

Вот обновленная программа <----------- </p>

class phonebook:

    def __init__ (self):
        self.allphones = {}

    def adddata(self, name, phone):
        self.allphones[name] = phone # append to the dictionary
        print ('A new phone book entry added - {0}:{1}'.format(name, phone)) # confirm the input
        print (self.allphones) # dump the complete phonebook data

name = input('Type person\'s name --> ')
phone = input('Type person\'s phone number --> ')

adding = phonebook()
adding.adddata(name, phone)

Вот вывод, который я получаю (я хочу {'abc': '123', 'ghj': '505050'} в качестве ответа) -

>>> ================================ RESTART ================================
>>> 
Type person's name --> abc
Type person's phone number --> 123
A new phone book entry added - abc:123
{'abc': '123'}
>>> ================================ RESTART ================================
>>> 
Type person's name --> ghj
Type person's phone number --> 505050
A new phone book entry added - ghj:505050
{'ghj': '505050'} 
>>> 

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Я думаю, вы серьезно запутались, что должно быть атрибутом класса, а что нет. Подумайте об этом так: в вашей телефонной книге есть словарь , поэтому словарь должен быть атрибутом. Имя и телефон добавляемого вами человека должны быть параметрами для adddata, а не экземплярами класса.

Как насчет этого изменения:

class phonebook:
    def __init__ (self):
        self.allphones = {}  # Empty dictionary

    def adddata(self, pername, perphone):
        self.allphones[pername] = perphone

# test code
book = phonebook()
book.adddata('joe', 121212)
book.adddata('bob', 129459)

print book.allphones

Для меня это печатает:

{'bob': 129459, 'joe': 121212}

Обновление: относительно вашего вопроса об обновлении - не уверены, чего вы пытаетесь достичь? Стойкость диктата через призывы сценария? Обратите внимание, что вы запрашиваете только одно имя и телефон и добавляете их в телефонную книгу. Когда вы снова запустите программу, она снова станет новой и чистой, поэтому, разумеется, информация о предыдущем вызове не сохраняется.

Если вам требуется постоянное хранилище, рассмотрите возможность использования pickle или shelve или даже какой-либо базы данных (например, модуль sqlite3 обеспечивает встроенный доступ к базе данных SQLite)

1 голос
/ 11 апреля 2011

Кажется, вам нужна телефонная книга, которая сохраняется между вызовами вашего скрипта.shelve модуль предоставляет постоянный словарь-объект.Если вы замените словарь self.allphones таким объектом, то получите постоянную телефонную книгу:

import shelve
from contextlib import closing

try: raw_input = raw_input
except NameError:
    raw_input = input # py3k

class phonebook:

    def __init__ (self, filename):
        self.allphones = shelve.open(filename, protocol=1, writeback=True)

    def adddata(self, name, phone):
        self.allphones[name] = phone # append to the dictionary
        self.allphones.sync()
        # confirm the input
        print ('A new phone book entry added - {0}:{1}'.format(name, phone))
        # dump the complete phonebook data
        print (dict(self.allphones.items())) 

    def close(self):
        self.allphones.close()

with closing(phonebook('.phonebook')) as adding:
    name = raw_input('Type person\'s name --> ')
    phone = raw_input('Type person\'s phone number --> ')
    adding.adddata(name, phone)

Если phone всегда неизменный объект, такой как строка, то вызовы writeback=True и .sync() могут быть опущены,Они нужны вам, когда вы хотите отследить несколько телефонных номеров на name в объекте списка и использовать тот же синтаксис для работы с полкой, что и для обычного словаря Python.

Пример

$ python3 phonebook.py 
Type person's name --> a
Type person's phone number --> 1
A new phone book entry added - a:1
{'a': '1'}

$ python3 phonebook.py 
Type person's name --> b
Type person's phone number --> 2
A new phone book entry added - b:2
{'a': '1', 'b': '2'}

$ python phonebook.py 
Type person's name --> c
Type person's phone number --> 3
A new phone book entry added - c:3
{'a': u'1', 'c': '3', 'b': u'2'}
0 голосов
/ 11 апреля 2011

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

Тем не менее, ваш класс работает на меня.Возможно, разница в том, как я это проверяю.Я вырезал и прошел ваш класс, чтобы создать следующий файл (phonebook.py):

    class phonebook :
            allphones = {}
            def __init__ (self, name, phone):
                self.pername = name
                self.perphone = phone

            def adddata(self):
                phonebook.allphones[self.pername] = self.perphone # append to the dictionary
                print ('A new phone book entry added - {0}:{1}'.format(self.pername, self.perphone)) # confirm the input
                print (phonebook.allphones) # display what is inside the phonebook  


    AA = phonebook('Arkanaoid', '123456789')
    AA.adddata()

    BB = phonebook('Bongo', '987654321')
    BB.adddata()

Если вы хотите добавить несколько телефонных номеров к одному и тому же человеку, я бы сделал что-то вроде (предупреждение: Я не пробовал этот код)

    class phonebook :
            allphones = {}
            def __init__ (self, name):
                self.pername = name

            def add_number(self, phone)
                self.perphone = phone
                phonebook.allphones.setdefault(self.pername, [])
                phonebook.allphones.append(perphone)

Так что теперь allphones - это словарь, отображающий имена на списки чисел.Сначала add_number гарантирует, что правильный список существует (по умолчанию [], если его нет), а затем добавляет к нему.

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