复制一个属性到一个变量,属性被改变
问题描述:
我想保存一个字典的列表作为JSON文件。该列表包含需要转换的日期时间对象,因此我将该列表传递给json_data
变量,将日期时间更改为字符串,然后将其保存。复制一个属性到一个变量,属性被改变
这里是我的代码添加新的字典条目,并将其保存:
TODAY = datetime.date.today()
class Deck():
def __init__(self):
self.cards = []
def add(self, question, answer):
'''Create a new card'''
card = {
'question': question,
'answer': answer,
'date_added': TODAY,
'review_date': TODAY,
}
self.cards.append(card)
def save(self):
'''Save cards'''
json_data = []
for card in self.cards:
json_data.append(card)
for data in json_data:
data['date_added'] = data['date_added'].isoformat()
data['review_date'] = data['review_date'].isoformat()
with open('cards.json', 'w') as obj:
json.dump(json_data, obj)
的文件保存好了,但由于某种原因self.cards
是得到改变,而不是json_data
。我希望self.cards中的日期时间对象保持这种状态。说的实例称为deck
:
>>> deck.add('1 + 1',2)
>>> deck.cards[0]['date_added']
datetime.date(2017, 2, 12)
>>> deck.save()
>>> deck.cards[0]['date_added']
'2017-02-12'
>>> deck.save()
Traceback (most recent call last):
data['date_added'] = data['date_added'].isoformat()
AttributeError: 'str' object has no attribute 'isoformat'
不知道为什么发生这种情况,我做了几个搜索,但没有找到一个解决方案。我很感激任何帮助。
答
当您保存您的数据时,您需要制作每张卡片的副本。否则,当您转换日期时,您仍然会修改原始卡片。
那么试试这个来代替:
def save(self):
'''Save cards'''
json_data = []
for card in self.cards:
card = card.copy()
card['date_added'] = card['date_added'].isoformat()
card['review_date'] = card['review_date'].isoformat()
json_data.append(card)
with open('cards.json', 'w') as obj:
json.dump(json_data, obj)
错误不匹配的标题 –