Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2020 21:50:54

riomenx
Зарегистрирован: 2019-09-13
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль pickle

Код адресной книги. Все четко работало. Скопировал код и начал проводить манипуляции. Когда запустил копию измененного кода,то перестал запускаться основной код). Удалил все созданные файлы .dat так как возможно произошла перезапись,но код все равно не запускается.
Как в этом коде использовать модуль shelve и в чем разница?
Код:

 import pickle
class Address:
    my_dict = dict()
    def __init__(self, key, value):
        self.key = key
        self.value = value
        Address.my_dict = dict()
        with open('booking.txt', 'w') as file:
            file.write(key)
            file.write(value)
        file.close()
    def __setitem__(self, key, value):
        self.key = input('Введите имя: ')
        self.value = input('Введите адрес: ')
        Address.my_dict[self.key] = self.value
        if self.key in Address.my_dict:
            print('\nАдрес:', Address.my_dict)
    def __delitem__(self, key):
        self.key = input('Введите имя для удаления: ')
        del Address.my_dict[self.key]
        print('\nВ адресной книге: {0} \
контактов\n'.format(len(Address.my_dict)))
        for name, address in Address.my_dict.items():
            print('\nКонтакт: {0}, с адресом {1}.'.format(name,
                                                          address))
    def change(self):
        self.key = input('Введите имя которое нужно изменить: ')
        del Address.my_dict[self.key]
        self.key = input('Введите новое имя: ')
        self.value = input('Введите новый адрес: ')
        Address.my_dict[self.key] = self.value
        if self.key in Address.my_dict:
            print('\nАдрес:', Address.my_dict)
    def find(self):
        self.key = input('Введите имя для поиска: ')
        if self.key in Address.my_dict:
            print('Адрес: ', Address.my_dict[self.key])
        if self.key is not Address.my_dict:
            print('Такого имени не найдено.')
    @staticmethod
    def loading():
        file = open('gip.data', 'rb')
        Address.my_dict = pickle.load(file)  # Помещаем объект в файл.
        file.close()
    @staticmethod
    def store():
        file = open('gip.data', 'wb')
        pickle.dump(Address.my_dict, file)  # Помещаем объект в файл.
        file.close()
r = Address('', '')
Address.loading()
running = True
while running:
    search = int(input('Введите - 1-Добавить контакт; 2-Удалить \
контакт;\
 3-Изменить контакт; 4-Найти контакт;\
 Для выхода их программы введите 5-Выход: '))
    if search == 1:
        r.__setitem__('', '')
        if len(Address.my_dict) == 100:
            print('Адресная книга переполнена, удалите 1 из контактов')
            r.__delitem__('')
    if search == 2:
        r.__delitem__('')
        Address.store()
    if search == 3:
        r.change()
        Address.store()
    if search == 4:
        r.find()
    if search == 5:
        Address.store()
        running = False
    if len(Address.my_dict) == 0:
        running = False

Отредактировано riomenx (Фев. 4, 2020 21:51:34)

Офлайн

#2 Фев. 8, 2020 21:01:33

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Модуль pickle

1. зачем сделал __delitem__() с ключами, если все-равно вводишь вручную.
2. то же и про __setitem__()
3. зач сделал ввод данных внутри методов класса, а не снаружи. Такие вещи не пихают в методы, т.к. методы лишь выполняют свою функцию с данными аргументами, а в каком виде их получить решай в глобал коде.

 from pickle import dumps, loads
class Addresses:
  def __init__(self, path):
    self.path = path
    with open(self.path, 'rb') as x:
      self.data = loads(x.read())
      assert self.data.__class__ == dict
  def __getitem__(self, key): return self.data[key] if key in self.data else None
  def __setitem__(self, key, value): self.data.__setitem__(key, value)
  def store(self):
    with open(self.path, 'wb') as x:
      x.write(dumps(self.data)))
# добавить контакт: if 'контакт' not in AddresssesInst.data: AddressesInst['контакт'] = контакт; else: pass
# удалить: del AddressesInst['контакт'] 
# изменить: AddressesInst['контакт'] = контакт



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Фев. 8, 2020 21:02:08)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version