Вместо этого:
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
Он присваивает свойству replist r
ссылку насписок L
.
Вы правы, вместо этих двух строк вы можете сделать это:
r = Rep(replist = L)
Что это значит - передать L
в функцию __init__
Rep
, с именем аргумента replist
.Функция __init__
Rep
унаследована от базового класса db.Model
.Эта функция присваивает значение любых аргументов, предоставленных свойству с тем же именем в модели.Так что в этом случае он присваивает L
свойству replist
.Таким образом, он имеет тот же эффект, что и исходные две строки кода, но работает немного по-другому.
В ответ на второй комментарий:
Оператор = вPython означает присвоение, которое не совпадает с математической эквивалентностью.
Итак, этот код:
r = Rep()
Не означает, что r
теперь эквивалентно Rep()
, и что вытеперь можно использовать r
и Rep()
для обозначения одного и того же.
Это означает, что r
теперь равно результату Rep()
.Rep()
выделяет новый экземпляр Rep
.Так что r
является ссылкой на новый Rep
.Чтобы обратиться к тому же экземпляру позже, вам необходимо использовать r
, а не Rep()
(который будет выделять новый экземпляр при каждом его вызове).