ndb.JsonProperty实例间值泄漏:是使用问题还是框架Bug?
问题分析与解决方案:ndb.JsonProperty 默认值泄漏问题
兄弟,我太懂这种踩坑的崩溃感了!你遇到的根本不是ndb的bug,而是Python里可变默认参数的经典陷阱——很多人第一次用都会栽进去,完全不是你的问题!
问题根源
当你在ndb.JsonProperty(default={})里直接传{}作为默认值时,这个空字典对象在类定义阶段就被创建了。也就是说,所有TestModel的实例都会共享这同一个字典对象!所以你在第一个实例entity1里修改这个字典的值,自然会意外泄漏到后续创建的entity2里——因为它们用的是内存里同一个对象。
你的期望完全合理
你希望每次实例化TestModel都得到一个“干净”的独立实例,这个需求非常正常,只是Python的可变默认参数特性容易被忽略,才导致了这个意外。
正确的解决方案
不要直接传可变对象(比如[]、{})作为默认值,而是传一个能返回新对象的函数。对于空字典来说,直接传dict即可:
ndb.JsonProperty(default=dict)
这样每次需要默认值的时候,ndb都会调用dict()生成一个全新的空字典,每个实例就都有自己独立的字典了,彻底解决值泄漏的问题。
关于你的临时解决方案
你提到的临时解决方案应该也是通过手动为每个实例初始化独立字典的方式规避了共享问题,不过上面的函数式默认值写法才是更规范、更省心的长期解决办法。
内容的提问来源于stack exchange,提问作者CodeBoy
相关产品推荐
相关产品推荐

