Python递归附加列表函数

时间:2015-08-19 17:55:26

标签: python recursion

有一个递归函数的问题应该相对简单,但看起来似乎没有问题。

我有一个包含文件夹的文件夹结构,可以包含其他文件夹,图像或文件。与每个文件夹相关联都有权限。我想让我的函数以递归方式构建一个与每个文件夹关联的权限列表。

我有一个函数has_read_permission(request),如果该文件夹具有权限,则返回True,如果不是,则返回False

我已经建立了这样的功能:

def get_child_perms(self, folder, request, perm_list):
        # Folder contains other folders
        if folder.get_children():
            # For every sub-folder
            for subfolder in folder.get_children():
                return perm_list.append(self.get_child_perms(subfolder, request, perm_list))
        else:
            # If folder doesn't have sub-folders containing folders
            return [folder.has_read_permission(request)]

我一直没有

给出像这样的文件夹:

Folder (allowed) - Wont check this one
|_First Folder (allowed)
| |_First sub Folder (restricted)
| | |_File
| | |_File
| | |_Image
| |__Second Sub Folder (allowed)
|_Second Folder (allowed)

然后运行get_child_perms()将返回 [真,假,真,真] 甚至 [True,[False,True],True]

修改

忽视编辑 - >问其他问题Python Recursive function missing results

改变了升技,

def get_child_perms(self, folder, request, perm_list):
        if folder.get_children():
            for subfolder in folder.get_children():
                perm_list.append(self.get_child_perms(subfolder, request, perm_list))
            return perm_list
        else:
            return [folder.has_read_permission(request)]

获得:

[[True], [...], [True], [...], [...], [True], [True], [True], [True], [True], [True], [True], [True], [...], [True], [...]]

 Admin
 -Folder 1
   - Files
 -Folder 2
   - Files
 -Folder 3
   - Files 
 -Folder 4
   - SubFolder 1
      -SubSubFolder 1
         - Files
      - Files
   - SubFolder 2
      - SubSubFolder 2
           - Files
      - Files
 -Folder 5
   - SubFolder 3
       - Files
   - SubFolder 4
       - Files
   - SubFolder 5
       -Files
   - Files
 -Folder 6
   - Files
 -Folder 7
   - SubFoler 6
       - Files
   - Files
 -Folder 8
   - Files

3 个答案:

答案 0 :(得分:4)

for subfolder in folder.get_children():
    perm_list.append(self.get_child_perms(subfolder, request, perm_list))
return perm_list

.append已到位。它没有返回任何内容。所以你得到None

答案 1 :(得分:3)

就地列表方法返回None以提醒您它们在适当的位置运行。

而不是:

return permlist.append(self.get_child_perms(...  # etc.

尝试:

permlist.append(self.get_child_perms(...
return permlist

编辑添加:正如其他评论/答案所指出的那样,如果您希望它完成,您将希望返回for循环之外。

答案 2 :(得分:1)

正如所指出的,append是一个返回None的 inplace 操作,你可以通过返回一个列表comp来避免使用def get_child_perms(self, folder, request, perm_list): # Folder contains other folders children = folder.get_children() if children: # For every sub-folder return [self.get_child_perms(subfolder, request, perm_list) for subfolder in children] return [folder.has_read_permission(request)]

back to top

您不需要其他人,因为您只能从该功能返回一次。