“用户”对象不可编辑是什么意思?

2024-09-30 01:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是对我的一个树行走算法问题的回答

MLM downline distribution count

我想遍历整个用户树并打印节点,但收到一条奇怪的错误消息:

TypeError: 'User' object is not iterable

这是我在树上行走时尝试运行的代码:

    downlinestack = []
    distributor=self
    downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999)
    while downlinestack:
        downline = downlinestack.pop()
        logging.info('downline: %s' %str(downline))
        for person in downline:
            downlinestack.append(User.query(User.sponsor == person.key).fetch(99999999))
            logging.info('person: %s' %str(person.key.id()))

我应该如何更改代码,使其遍历通过发起人属性连接的用户树?在

谢谢你

更新

我找到了一个递归的解决方案,如下所示:

^{pr2}$

Tags: key代码用户info算法loggingfetchquery
3条回答

线

downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999)

期望RHS返回一个扩展downlinestack的列表。在

^{pr2}$

除非用户.查询().fetch()返回一个列表,我怀疑您的意思是

downlinstack.append(downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999))

我的另一个猜测是,无论您在downlinestack中附加的内容都是不可编辑的,因此下面的行失败了

for person in downline:

让我通过逐行检查代码来澄清:

downlinestack = []
distributor=self
downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999)

首先,您没有告诉我们User.query返回什么。我假设这是一个用户对象列表。所以现在downlinestack看起来是这样的:[User1, User2, User3]

^{pr2}$

现在,downline包含从堆栈末尾弹出的单个用户,User3。在

    logging.info('downline: %s' %str(downline))
    for person in downline:

这是您的错误:User3不可编辑。这并不神秘:它不是那种物体。它不是一个可以依次迭代访问的项的集合。如果你想在这里迭代一些东西,你必须自己生成iterable。在

有两种可能的方法。第一种方法是迭代用户.查询公司名称:

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

如您所见,这将打印出查询树中每个人的id(除了根id 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

为什么不只用两个嵌套的for?在

for downline in User.query(User.sponsor == distributor.key).fetch(99999999):
    logging.info('downline: %s' %str(downline))
    for person in downline:
        downlinestack.append(User.query(User.sponsor == person.key).fetch(99999999))
        logging.info('person: %s' %str(person.key.id()))

相关问题 更多 >

    热门问题