首页 > 解决方案 > 在 Python 中使用类时如何正确使用书架?

问题描述

我正在编写一些代码来学习如何更好地使用类。我了解了程序中的持久性和 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)

有人可以解释一下我在做什么错吗?

标签: pythonpersistencepickleshelve

解决方案


这段代码有几处需要修复。

首先,它没有运行,因为这一行无效,它缺少一个结束 '}'。

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和。datanamesurnamenotes

如果我们修复这些名称并再次运行,我们会得到:

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

Ina是您在其中创建的变量的名称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

推荐阅读