Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么键:值对不能添加到字典中?_Python_Dictionary_Sqlalchemy - Fatal编程技术网

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