Как правильно использовать полки при работе с классами в Python? - PullRequest
0 голосов
/ 27 мая 2019

Я делаю код, чтобы узнать, как лучше использовать классы.Я узнал о постоянстве в программах и о полках в Python.Я пытаюсь сделать так, чтобы пользователь ввел какой-то материал, который затем используется для создания объекта моего единственного класса.

import shelve
filearch = shelve.open('archive')
filearch['patients'] = {}

class Patient():
    def __init__(self, name='', surname='', notes=''):
        self.name = name
        self.surname = surname
        self.notes = notes

def makeone():
    print('Insert a name')
    nome = input('Nome: ')
    print('Insert a surname')
    cognome = input('surname: ')
    print('Insert notes')
    data = input('notes: ')
    a = {'name': name, 'surname': surname, 'notes': notes}
    return a
def addone():
    users_pat = Patient(**makeone())
    return users_pat

def save(user_paz):
    return filearch['patients'].update({user_paz : a)

Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

0 голосов
/ 27 мая 2019

В этом коде есть несколько вещей, которые нужно исправить.

Во-первых, он не запускается, потому что эта строка недействительна, отсутствует закрывающий '}'.

return filearch['patients'].update({user_paz : a)

Как только это будет исправлено, запустите код, подобный этому

user = addone()
save(user)

приводит к этой ошибке:

Traceback (most recent call last):
  File "test.py", line 30, in <module>
    user = addone()
  File "test.py", line 21, in addone
    users_pat = Patient(**makeone())
  File "test.py", line 18, in makeone
    a = {'name': name, 'surname': surname, 'notes': notes}
NameError: name 'name' is not defined

Это потому, что в makeone вы присваиваете входные значения nome, cognome и data, но пытаетесь сохранить несуществующие переменные name, surname и notes.

Если мы исправим эти имена и снова запустим, мы получим:

Traceback (most recent call last):
  File "test.py", line 31, in <module>
    save(user)
  File "test", line 26, in save
    return filearch['patients'].update({user_paz: a})
NameError: name 'a' is not defined

In a - это имя переменной, которую вы создаете в makeone, но это имя допустимо только внутри функции makeone. функция save знает только о переменной user_paz, которую вы ей передали, поэтому измените

return filearch['patients'].update({user_paz : a})

до

return filearch['patients'].update({user_paz : user_paz})

Наконец, как уже упоминалось в комментариях, вам необходимо закрыть файл полки, чтобы убедиться, что содержимое сохранено.

Вот улучшенная версия вашего кода: он сохраняет ввод и затем сообщает о содержимом файла полки.

import shelve


class Patient:
    def __init__(self, name='', surname='', notes=''):
        self.name = name
        self.surname = surname
        self.notes = notes

    def __repr__(self):
        # A readable representation of a Patient object.
        return '<Patient(name={0.name}, surname={0.surname}, notes={0.notes}>'.format(self)

    # Use the same readable representation if str(patient) is called.
    __str__ = __repr__


def makeone():
    print('Insert a name')
    name = input('Nome: ')
    print('Insert a surname')
    surname = input('surname: ')
    print('Insert notes')
    notes = input('notes: ')
    a = {'name': name, 'surname': surname, 'notes': notes}
    return a


def addone():
    users_pat = Patient(**makeone())
    return users_pat


def save(user_paz):
    with shelve.open('archive') as archive:
        archive['patients'] = {user_paz.name: user_paz}
    return


def report():
    with shelve.open('archive') as archive:
        for name, patient in archive.items():
            print(name, patient)
    return


def main():
    patient = addone()
    save(patient)
    report()
    return
...