首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么键:值对不添加到字典中?

为什么键:值对不添加到字典中?
EN

Stack Overflow用户
提问于 2014-10-31 10:56:00
回答 1查看 69关注 0票数 1

这段代码不添加到字典中的原因可能是什么(假设它要进入else块):

代码语言:javascript
复制
if dup_agent_log.modify_stamp > merge_agent_log.modify_stamp:
    merge_agent_log.set_status_log(dup_agent_log.status, None, dup_agent_log.agents_id, dup_agent_log.source, dup_agent_log.status_type)
else:
    print merge_agent_log.data # {}
    now = str(datetime.datetime.now())
    merge_agent_log.data[now] = [{"status": dup_agent_log.status, "change_agent": dup_agent_log.change_agent, "source": dup_agent_log.source}]
    print "after", merge_agent_log.data # after {}

transaction.savepoint()

AgentStatusLog()类(模型):

代码语言:javascript
复制
class AgentStatusLog(Base):
__tablename__ = "agent_status_log"
id = Column(
    Integer,
    Sequence("agent_status_log_id", optional=True),
    primary_key=True
)
status_id = Column(Integer, ForeignKey(StatusLookup.id))
_status = relationship(StatusLookup, uselist=False)
status = Column(Unicode(100), index=True)
previous_status = Column(Unicode(50), index=True)
effective_stamp = Column(DateTime, index=True)
modify_stamp = Column(DateTime, index=True)
agents_id = Column(Integer, ForeignKey(Agents.id))
agent = relationship(Agents, primaryjoin=Agents.id == agents_id, uselist=False)
_data = Column("data", Unicode(2048))
status_type = Column(Unicode(40), index=True)
change_agents_id = Column(Integer, ForeignKey(Agents.id))
change_agent = relationship(Agents, primaryjoin=Agents.id == change_agents_id, uselist=False)
source = Column(Unicode(100), index=True)


@property
def data(self):
    if not self._data:
        return {}
    return json.loads(self._data)

@data.setter
def data(self, value):
    self._data = json.dumps(value)

def set_data(self, field, value):
    data = self.data
    data[field] = value
    self.data = data

def get_data(self):
    if not self._data:
        return {}
    return json.loads(self._data)

def unset_data(self, field):
    data = self.get_data()
    if field in data:
        del data[field]
        self.data = data

@classmethod
def by_id(cls, id):
    return Session.query(cls).filter(cls.id == id).first()

@classmethod
def by_agents_id(cls, aid):
    return Session.query(cls).filter(cls.agents_id == aid).first()

@classmethod
def set_status_log(cls, status, change_agent=None, agent_id=None, source=None, status_type=None):
    if agent_id:
        sl = Session.query(cls).filter(cls.agents_id == agent_id).first()
        sl.modify_stamp = func.now()
        sl.source = source
        if sl.status:
            sl.previous_status = sl.status
            sl.data[str(datetime.datetime.now())] = [{"status": sl.status, "change_agent": change_agent, "source": source}]
        sl.status = status
        sl.change_agents_id = change_agent
        sl.status_type = status_type
        transaction.commit()

也许我只是忘了看些简单的东西,但这让我心烦意乱.当我在我的蟒蛇壳里做同样的事情时,它会起作用.

merge_agent_log是一个SQLAlchemy对象。

  • 有什么可能会导致这个原因呢?

  • 我是不是遗漏了什么?我在这已经有两天了.

  • 在任何情况下,dict的条目都会使用data["foo"] = "bar"失败吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-31 13:03:07

没有一个did在这里失败了,只是你创建了不止一个did,却没有意识到它。

让我们仔细分析merge_agent_log.data[now] = something:首先调用属性getter。它读取_data并使用json.loads创建一个新的dict。然后修改这个新的dict,为键something添加now

但是你不能修改_data

因此,下次使用merge_agent_log.data调用属性getter时,您将从_data读取相同的字符串,并创建另一个具有与之前相同内容的数据集。

试试这个:

代码语言:javascript
复制
data = merge_agent_log.data
data[now] = something
merge_agent_log.data = data  # calls property setter, which modifies _data
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26672980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档