python - 在 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)
有人可以解释一下我在做什么错吗?
解决方案
这段代码有几处需要修复。
首先,它没有运行,因为这一行无效,它缺少一个结束 '}'。
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
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
推荐阅读
- javascript - 如何在 li 元素中的 ng-if 中发送范围变量?
- azure - Azure Speech to Text 教程
- php - Symfony 表单将用户兴趣的选择存储到 UserInterests
- python - 在 python scapy 中解码 MX 记录的 DNS 应答 rrdata
- php - strpos 不适用于逗号分隔字符串中的第一个字符串
- javascript - 如何修复:在线共享点保存当前用户和状态的过滤查找
- python - Tornado-swirl 没有获取 URL 中的参数
- python - 如何获取导入某个包的python文件的路径?
- relational-database - 我不明白这个问题的答案与自然连接和投影
- javascript - 在 puppeteer/JavaScript 中重试 page.goto、page.waitForNavigation 等的最佳实践