Позвольте мне уточнить, пройдя по строке кода строка за строкой:
downlinestack = []
distributor=self
downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999)
Прежде всего, вы не сказали нам, что возвращает User.query
.Я предполагаю, что это список пользовательских объектов.Итак, теперь downlinestack
выглядит следующим образом: [User1, User2, User3]
while downlinestack:
downline = downlinestack.pop()
Теперь downline
содержит одного пользователя, выскочившего из конца стека, User3
.
logging.info('downline: %s' %str(downline))
for person in downline:
Вот ваша ошибка: User3
не повторяется .Там нет никакой тайны: это просто не такой объект.Это не набор элементов, к которым можно обращаться по очереди, итеративно.Если вы хотите перебрать что-то здесь, , вы должны создать итерацию самостоятельно .
Существует два возможных способа сделать это.Первый - перебрать список, возвращаемый User.query:
distributor=self
downlinestack = User.query(User.sponsor == distributor.key).fetch(99999999)
while downlinestack:
top_person = downlinestack.pop()
logging.info('top_person: %s' %str(top_person))
for person in User.query(User.sponsor == top_person.key).fetch(99999999):
downlinestack.append(person)
Другой вариант - сделать downlinestack
списком списков:
distributor=self
downlinestack = [User.query(User.sponsor == distributor.key).fetch(99999999)]
while downlinestack:
downline_top = downlinestack.pop()
for person in downline_top:
downlinestack.append(User.query(User.sponsor == person.key).fetch(99999999))
logging.info('person: %s' %str(person.key.id()))
Любой из этихдолжно работать.
У меня недостаточно контекста, чтобы проверить вышесказанное, но я создал собственную упрощенную схему тестирования, чтобы проиллюстрировать тот факт, что это действительно работает.
>>> query_tree = {0: [1, 2, 3], 1: [4, 5], 2: [6], 3: [7, 8, 9, 10], 4: [],
5: [11, 12], 6: [], 7: [], 8: [13], 9: [], 10: [], 11: [14],
12: [], 13: [], 14: []}
>>> stack = query_tree[0][:] #make a copy to avoid changes to `query_tree`
>>> while stack:
... top_person = stack.pop()
... print top_person
... for person in query_tree[top_person]:
... stack.append(person)
...
3
10
9
8
13
7
2
6
1
5
12
11
14
4
КакВы можете видеть, что это печатает идентификатор каждого человека в дереве запросов (кроме корневого идентификатора, 0).
Тогда другой подход:
>>> stack = [query_tree[0]]
>>> while stack:
... top_person_list = stack.pop()
... for person in top_person_list:
... print person
... stack.append(query_tree[person])
...
1
2
3
7
8
9
10
13
6
4
5
11
12
14