2014-10-31 38 views
1

可能是什么这个代码不添加到字典中的原因(假设它会为else块):为什么key:value对不会被添加到字典中?

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()类(模型):

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() 

也许我“M刚过寻找简单的东西,但是这博格尔斯我的脑海里......当我做同样的事情在我的Python的外壳,它的工作原理...
merge_agent_log是SQLAlchemy的对象。

  • 什么可能会可能导致这个原因吗?
  • 我错过了什么吗?我在这两天是具有...
  • 使用data["foo"] = "bar"任何情况下的字典中的条目会失败有没有?
+0

,请复制粘贴'merge_agent_log'类的定义。 – 2014-10-31 11:03:16

+0

如果'merge_agent_log.data'实际上是一个'dict'(不是一个字典或者一些奇特的字典子类),没有理由不应该设置你的键/值......“假设它进入else块” , 当然。 – 2014-10-31 11:05:07

+0

好奇心! Try:merge_agent_log.data [now] .append({“status”:dup_agent_log.status,“change_agent”:dup_agent_log.change_agent,“source”:dup_agent_log.source}) – user3378649 2014-10-31 11:11:39

回答

1

没有字典在这里失败,它只是你创建了多个字典,并没有意识到它。

我们来分析一下merge_agent_log.data[now] = something密切:第一属性getter被调用。它读取_data并创建一个新的字典json.loads。然后你修改这个新的字典,为now密钥添加something

但是您不要修改_data

因此,下次您拨打merge_agent_log.data致电属性获得者时,您会从_data中读取相同的字符串,并创建另一个字典,其中的内容与以前的内容相同。

试试这个:

data = merge_agent_log.data 
data[now] = something 
merge_agent_log.data = data # calls property setter, which modifies _data 
+0

谢谢,这个伟大的工程':)' – Renier 2014-10-31 14:04:40

相关问题