Python 将空列表指定给具有默认值的StringListProperty会导致实体具有默认值吗?

Python 将空列表指定给具有默认值的StringListProperty会导致实体具有默认值吗?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,下面的完整工作示例可以在交互式控制台中运行 这是预期的吗?如果是,我有两个问题: 1) 请在GAE文档中说明这一点 2) 请显示db.Model的模式,该模式在创建时默认为某些属性的填充列表,但仍允许我们在稍后分配空列表(或无) from google.appengine.ext import db class TestClass(db.Model): my_string_list = db.StringListProperty(default=['foo', 'bar']) ins

下面的完整工作示例可以在交互式控制台中运行

这是预期的吗?如果是,我有两个问题:

1) 请在GAE文档中说明这一点

2) 请显示
db.Model
的模式,该模式在创建时默认为某些属性的填充列表,但仍允许我们在稍后分配空列表(或无)

from google.appengine.ext import db

class TestClass(db.Model):
    my_string_list = db.StringListProperty(default=['foo', 'bar'])

instance = TestClass()
instance.put()

print instance.my_string_list
#['foo', 'bar']

instance.my_string_list = []
instance.put()
print instance.my_string_list
#[]

instance2 = db.get(instance.key())
print instance2.my_string_list
#expected [], got ['foo', 'bar'] ???

值得注意的是,对于NDB(较新的数据存储API),重复、必需和默认是相互排斥的。也就是说,重复属性(例如StringListProperty)不能有默认值。也许您需要重新设计,而不是使用默认值,创建一个函数来获取模型的新实例:

from google.appengine.ext import db

class TestClass(db.Model):
    my_string_list = db.StringListProperty(default=[])

    @classmethod
    def get_new_instance(cls):
       entity = cls()
       entity.my_string_list = ['foo', 'bar']
       return entity

这都是假设您打开的bug报告在一段时间内不会被处理。如果他们在NDB上不支持此功能,它可能会变成与旧DB API类似的情况。

这很奇怪,在数据存储中查找它看起来像是存储在空列表中,但当它被读出时,它的默认值会被放回原处。也许是E GAE的错误?我想在issue trackerdone上打开一个问题:虽然这很奇怪,但将可变对象作为默认参数传递通常是个坏主意。