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
基类。没有真正的谜团。

你说得对,我忘了用
**
扩展示例中的卡丁车,我已经解决了这个问题。你说的是真的;这就是它的工作原理,但在本例中,数据被放入数据库,稍后再获取,因此它不仅绑定到实例,而且被存储。