这是对我的其他question的跟进。
我以为
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))
更新
作为可能遇到同样问题的其他人的参考;我发布了下表,这对我很有帮助。 (原here)
Rep().........................Rep object
Rep.all().....................Query object
list(Rep.all())...............List of Rep objects.
list(Rep.all())[0]............A single Rep object
list(Rep.all())[0].replist....A list
感谢所有答案。
答案 0 :(得分:3)
而不是:
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))
您正在all()
的实例上调用Rep
- 您应该直接在课堂上调用它。此外,您不需要将结果包装在list()
中,因为fetch()
已经返回了一个列表。
然后在下面你有这个:
self.response.out.write(len(P))
您试图获得P
(Rep
)的长度,而不是P
replist
的长度。
<强>更新强>
回应第一条评论:
在此代码中:
r = Rep()
Rep()
正在创建Rep
的实例。然后r =
将该实例分配给名称r
。现在名称r
引用了Rep
的实例。
然后在这段代码中:
r.replist = L
指定r
的replist属性以引用列表L
。
你是对的,而不是那两行,你可以这样做:
r = Rep(replist = L)
这样做是将L
传递给__init__
的{{1}}函数,参数名称为Rep
。 replist
__init__
函数继承自Rep
基类。此函数指定提供给模型上同名属性的任何参数的值。因此,在这种情况下,它会将db.Model
分配给L
属性。因此它与原始的两行代码具有相同的效果,但它的工作方式略有不同。
回应第二条评论:
Python中的=运算符表示赋值,它与数学等价不同。
所以这段代码:
replist
并不意味着r = Rep()
现在等同于r
,并且您现在可以使用Rep()
和r
来表示同样的事情。
这意味着Rep()
现在等于r
的结果。 Rep()
的作用是分配Rep()
的新实例。这样,Rep
就可以引用新的r
。要在以后引用同一个实例,您需要使用Rep
,而不是r
(每次调用时都会分配一个新实例)。
答案 1 :(得分:0)
试试这个:
self.response.out.write(len(mylist))
答案 2 :(得分:0)
如果您要打印重新列表属性的元素数量。
self.response.write(len(P.replist));
希望我能帮到你:p