【问题标题】:GAE ndb.JsonProperty() default listGAE ndb.JsonProperty() 默认列表
【发布时间】:2014-09-22 15:14:28
【问题描述】:

我有以下设置。为什么 JsonProperty 的默认列表属性会保留之前在其他实体中分配给它的值。我错过了什么吗?

class Item(ndb.Model):
    foo = ndb.JsonProperty(default=[])

    def add_to_foo(self, value):
        self.foo.append(value)
        return

item1 = Item()
item1.add_to_foo('one')
item1.put()

item2 = Item()
item2.add_to_foo('two')
item2.put()

print item2.foo  # prints out ['one', 'two']

为什么会打印出 ['one', 'two']?我只给了它“两个”。这是预期的行为吗?

【问题讨论】:

    标签: python json google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    是的,这是预期的行为——但为什么解释起来有点棘手。问题是您将list 实例传递给JsonProperty 初始化程序。这个列表实际上是global。所以,只要你得到“默认”foo,你就会得到全局实例——并且附加到它会在任何地方附加到它。

    这里的重点是不要使用可变参数作为默认值。你最好重写add_to_foo

    def add_to_foo(self, value):
        if self.foo:
            self.foo.append(value)
        else:
            self.foo = [value]
    

    请注意,如果您将.get 的其中一项从数据存储区中退出,这将变得更加有趣。假设实体没有在本地缓存,那么此时它们将没有对全局列表的引用——只有列表状态为 .put 时的副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2011-11-26
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2013-03-10
      相关资源
      最近更新 更多