以下是我的设置:dictD
包含与值= users
配对的密钥list of UserObjects
。每个UserObject
都有一个属性用户名加上两个数组,线程和注释。
我能够通过此调用将dictD的用户对象数组转换为字典样式:
dictD["users"] = [user.__dict__ for user in dictD["users"]
]
如果我倾倒dictD,在我尝试进行操作之前,这里是相关的部分:
{
'users':[
{
'username': Redditor(user_name='$$$$$$$$$$'),
'threads':[
<__main__.redditThread instance at 0x7f05db28b320>
],
'comments':[
<__main__.comment instance at 0x7f05db278e60>
]
},
{
'username': Redditor(user_name='##########e\ gone'),
'threads':[
<__main__.redditThread instance at 0x7f05db2a4a70>
],
'comments':[
<__main__.comment instance at 0x7f05db298e18>
]
}
正如您所看到的,注释包含comment
个对象,而线程列表包含thread
个对象。所以我想为users
数组做同样的调用。但是当我尝试这样做时:
for user in dictD["users"]:
user.threads = [thread.__dict__ for thread in user.threads]
user.comments = [comment.__dict__ for comment in user.comments]
我遇到了这个错误:
AttributeError: 'dict' object has no attribute 'threads'
我也试过
users = dictD["users"]
for user in users...
但是这会触发相同的错误消息。当这些对象出现时,如何将列表中的对象转换为字典形式?列表本身是否保存在字典中的列表中的对象中?
顺便说一句,我正在做这一切,所以我可以将这些对象插入到MongoDB中,所以如果有更简单的方法来序列化复杂的对象,请让我进入秘密。谢谢。
答案 0 :(得分:1)
将我的评论提升为答案,因为它似乎是合理的而且没有其他人发帖:它看起来像是在混淆Python for Javascript:带有键'thread'的字典不是你可以用{引用的对象} {1}},仅限.threads
。即。 ["threads"]
应为user.threads
。 dict通常只有相同的标准属性(请参阅:{3}}或{3}}用于Python 3.)问题不是你试图在一个对象上调用user["threads"]
,它是你试图从一个不存在的对象中获取一个属性,稍后在同一行代码中。
如果要从MongoDB重新创建复杂对象而不仅仅是嵌套的dicts和列表,那么这基本上就是反序列化的过程;您可以手动处理,也可以使用某种对象映射库为您执行此操作(例如https://docs.python.org/2/library/stdtypes.html#typesmapping之类的东西可能有效,但我自己没有测试过它)