Форум сайта python.su
0
Код адресной книги. Все четко работало. Скопировал код и начал проводить манипуляции. Когда запустил копию измененного кода,то перестал запускаться основной код). Удалил все созданные файлы .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)
Офлайн
13
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)
Офлайн