Python 为什么ndb.Model子类在填充时会扩展?
我们有一个定义如下的模型Python 为什么ndb.Model子类在填充时会扩展?,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我们有一个定义如下的模型 class Foo(ndb.Model): bar = ndb.TextProperty() 如果我创建了一个Foo的实例,或者get,并将其命名为Foo,则此操作有效 foo.populate(**{'SPAM': None}) 这为foo提供了一个新的SPAM属性 我想知道如何使它在更新不存在的属性时引发异常。我以为它应该在盒子外面做 作为记录,新属性也是非类型化的,因此我可以将SPAM设置为5,然后“五个”,没问题。我很确定这是设计的。您可以对foo对象执行任
class Foo(ndb.Model): bar = ndb.TextProperty()
如果我创建了一个Foo
的实例,或者get
,并将其命名为Foo
,则此操作有效
foo.populate(**{'SPAM': None})
这为foo
提供了一个新的SPAM
属性
我想知道如何使它在更新不存在的属性时引发异常。我以为它应该在盒子外面做
作为记录,新属性也是非类型化的,因此我可以将
SPAM
设置为5
,然后“五个”
,没问题。我很确定这是设计的。您可以对foo
对象执行任何您想要的操作,就像您也可以为条
指定整数值一样,如果您想要,甚至可以删除此属性。但在存储该值时,它将只存储在模型中定义的、具有正确类型的属性。仅当现有属性的类型或值与其定义不匹配时,才会引发异常。运行您发布的代码将引发TypeError,因为populate需要与属性名称匹配的关键字args,而不是dict.调用foo.populate(**{“SPAM”:None})
或foo.populate(SPAM=None)
将升高
AttributeError: type object 'Foo' has no attribute 'SPAM'
你确定你的实际代码和你的例子没有什么不同吗?(你的模型可能是Expando子类吗?格雷格说:“你的模型可能是Expando子类吗?”这是我一开始问自己的问题,但在实际的代码ndb中。Model
是我们用于其他一切的基类
应用程序的用户
模型实际上来自我们使用的auth库,webapp2_extras.appengine.auth.models
,它可能使用Expando
基类
我测试了这个模型,以及我们抛出的所有其他模型都出现了预期的异常
TL;DRwebapp2_extras.appengine.auth.models中的
User
模型使用Expando
基类。没有真正的谜团。你说得对,我忘了用**
扩展示例中的卡丁车,我已经解决了这个问题。你说的是真的;这就是它的工作原理,但在本例中,数据被放入数据库,稍后再获取,因此它不仅绑定到实例,而且被存储。