gpt4 book ai didi

python - Google应用程序引擎和Python以及按值传递的对象

转载 作者:行者123 更新时间:2023-11-28 21:30:48 26 4
gpt4 key购买 nike

这确实是一个 Python 语言问题,但它围绕着 Google 应用引擎特定问题。

我们有

class User( db.Model ) :  email = db.StringProperty()  name = db.StringProperty()  password = db.StringProperty()  # more fields..

由于用户帐户被频繁访问,我们使用 gaeutilities 在 session 中保留一个副本(作为一个额外的问题,这对 GAE 来说很糟糕吗?我想我可以减轻数据库的负担。)

class UpdateProfile( webapp.RequestHandler ):  def post( self ):    # User posting update to his name    self.session = sessions.Session()    #######    # way#1: update the copy of the User object in SESSION, then .put() it    self.session[ 'current_user' ].name = self.request.get( 'name' )    self.session[ 'current_user' ].put()    # does not work.    #######    #######    # way#2: make a copy of the User object in SESSION, then .put() it    user = self.session[ 'current_user' ]    user.name = self.request.get( 'name' )    user.put()    # works to update the datastore, but the copy of user in self.session    # is NOT UPDATED!  I thought Python was    # pass-by-reference.  It is when you work with lists anyway.    # Why isn't it "acting right" with this type of object??    #######    #######    # way#3: way that works.    user = self.session[ 'current_user' ]    user.name = self.request.get( 'name' )    user.put()    self.session[ 'current_user' ] = user    # works completely    #######

这 3 种情况分别发生了什么?为什么情况 1 和 2 不起作用?

最佳答案

我猜:

将对象放入 session 中意味着对象被序列化(通常是腌制的)并存储在某个地方(磁盘、内存、数据库)。当从 session 中检索它时,会根据序列化的旧状态创建一个对象。

  • 在第一个示例中,每个 self.session[ 'current_user' ] 都会为您提供一个新对象,您可以更新其中一个对象,另一个则保存到数据库中。
  • 在第二个中,您获得一个对象,将其保存到数据库中,但不保存到 session 中。

顺便说一句,Python 确实“通过共享调用”,但这与您的问题无关;-)

关于python - Google应用程序引擎和Python以及按值传递的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com