Python fetch()在GAE中获取什么?
这是我的另一篇文章的后续 我以为Python fetch()在GAE中获取什么?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,这是我的另一篇文章的后续 我以为 mylist = list(Rep().all().fetch(50)) 使mylist成为一个列表。但当我试图知道它的长度时,我得到了信息 self.response.out.write(len(P)) TypeError: object of type 'Rep' has no len() 谁能解释我做错了什么 Rep().replist = L Rep().p
mylist = list(Rep().all().fetch(50))
使mylist
成为一个列表。但当我试图知道它的长度时,我得到了信息
self.response.out.write(len(P))
TypeError: object of type 'Rep' has no len()
谁能解释我做错了什么
Rep().replist = L
Rep().put()
mylist = list(Rep().all().fetch(50))
P = mylist.pop()
self.response.out.write(len(P))
更新
作为可能遇到相同问题的其他人的参考;我发布了下表,这对我很有帮助。(原件)
谢谢你的回答 试试这个:
self.response.out.write(len(mylist))
如果要打印replist属性的元素数
self.response.write(len(P.replist));
希望我能帮助你:p而不是这个:
Rep().replist = L
Rep().put()
mylist = list(Rep().all().fetch(50))
P = mylist.pop()
self.response.out.write(len(P))
试着这样做:
r = Rep()
r.replist = L
r.put()
mylist = Rep.all().fetch(50)
P = mylist.pop()
self.response.out.write(len(P.replist))
你的密码是:
Rep().replist = L
Rep().put()
正在创建一个Rep
实例,然后将其replist
分配给L
。然后它创建另一个Rep
,并对其调用put()
。因此,您正在写入数据存储的是一个空白的Rep
——它不会有您的列表
在此代码中:
mylist = list(Rep().all().fetch(50))
r = Rep()
r.replist = L
r = Rep()
您正在对Rep
的实例调用all()。另外,由于fetch()
已经返回了一个列表,因此不需要将结果包装在list()
中
然后在下面你有这个:
self.response.out.write(len(P))
您试图获取的是p
(这是一个Rep
)的长度,而不是p
的replist
的长度
更新:
针对第一条评论:
在此代码中:
mylist = list(Rep().all().fetch(50))
r = Rep()
r.replist = L
r = Rep()
Rep()
正在创建Rep
的实例。然后,r=
将该实例分配给名称r
。所以现在名称r
指的是Rep
的实例
那么在这个代码中:
mylist = list(Rep().all().fetch(50))
r = Rep()
r.replist = L
r = Rep()
它正在分配r
的replist属性以引用列表L
您是正确的,您可以这样做,而不是这两行:
r = Rep(replist = L)
这样做的目的是将L
传递给Rep
的\uuuuu init\uuuu
函数,参数名为replist
。Rep
的\uuuuu init\uuuu
函数继承自db.Model
基类。此函数用于将提供给模型上同名属性的任何参数的值赋值。因此在本例中,它将L
分配给replist
属性。因此,它的效果与最初的两行代码相同,但工作方式略有不同
针对第二条评论:
Python中的=运算符表示赋值,这与数学等价不同
所以这个代码:
mylist = list(Rep().all().fetch(50))
r = Rep()
r.replist = L
r = Rep()
并不意味着r
现在等同于Rep()
,并且您现在可以使用r
和Rep()
来表示相同的意思
这意味着r
现在等于Rep()
的结果。Rep()
所做的是分配一个Rep
的新实例。因此,这使得r
成为对新Rep
的引用。因此,要在以后引用同一实例,您需要使用r
,而不是Rep()
(每次调用时都会分配一个新实例)。p not list。这是一个“Rep”实例。如何将其制作为列表,以便打印replist的元素?len(mylist)返回mylist中的列表数。我假设P=mylist.pop()将弹出mylist中的最后一个列表。我想打印弹出列表中的元素。但正如DonaldlsFreak提到的,弹出的不是一个列表,而是一个“Rep”实例。抱歉,我不明白为什么我保存到数据存储的列表没有返回。或者,执行此简单数据库操作的最佳方法是什么?再次感谢。@Saxon Druce:谢谢你的解释,这很有帮助。我还在研究它,但你知道是否有一种替代点符号的符号;例如,我相信你的r.replist=L
等同于Rep(replist=L)
对吗?这对我来说更有意义。再次感谢。@Saxon Druce:你说得对;我写入数据存储的那个肯定是空的,因为模板正在打印空列表。但据我所知,你的r.replist=lr.put
与我的相当,因为你定义了r=Rep()。对的还是我遗漏了什么?另一个注意事项是:您不需要将.fetch()的返回包装在列表()中-返回值已经是一个列表。谢谢Nick!我已经更新了我的答案,提到list()不是必需的。