Python 为什么键:值对不能添加到字典中?
此代码不添加到字典的原因可能是什么(假设它将进入Python 为什么键:值对不能添加到字典中?,python,dictionary,sqlalchemy,Python,Dictionary,Sqlalchemy,此代码不添加到字典的原因可能是什么(假设它将进入else块): AgentStatusLog()类(模型): 也许我只是在看一些简单的东西,但这让我难以置信。。。当我在python shell中执行相同的操作时,它会工作… merge\u agent\u log是一个SQLAlchemy对象 什么可能导致这种情况? 我错过什么了吗?这件事我已经做了两天了 在任何情况下,使用数据[“foo”]=“bar”? 此处没有dict失败,只是您创建了多个dict,但没有意识到 让我们仔细分析一下merg
else
块):
AgentStatusLog()
类(模型):
也许我只是在看一些简单的东西,但这让我难以置信。。。当我在python shell中执行相同的操作时,它会工作…merge\u agent\u log
是一个SQLAlchemy对象
- 什么可能导致这种情况?
- 我错过什么了吗?这件事我已经做了两天了
- 在任何情况下,使用
?数据[“foo”]=“bar”
- 此处没有dict失败,只是您创建了多个dict,但没有意识到
让我们仔细分析一下
merge\u agent\u log.data[now]=something
:首先调用属性getter。它读取\u数据
,并使用json.loads创建一个新的dict。然后修改这个新的dict,现在为key添加内容
但您不能修改数据
因此,下次使用merge\u agent\u log.data
调用属性getter时,您将从\u data
中读取相同的字符串,并创建另一个dict,其内容与之前相同
试试这个:
data = merge_agent_log.data
data[now] = something
merge_agent_log.data = data # calls property setter, which modifies _data
请粘贴merge\u-agent\u-log
类的定义。如果merge\u-agent\u-log.data
确实是一个dict
(既不是dict类,也不是其他dict子类),则没有理由不设置您的键/值。。。“假设它要进入else块”,当然。好奇!尝试:合并代理日志.data[now].append({“status”:dup\u agent\u log.status,“change\u agent”:dup\u agent\u log.change\u agent,“source”:dup\u agent\u log.source})@user3378649不,不起作用:/。。。我用AgentStatusLog
类更新了问题。正如我所想,这里没有dict失败-检查我的答案:)
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()
data = merge_agent_log.data
data[now] = something
merge_agent_log.data = data # calls property setter, which modifies _data