Python递归追加列表函数

Python递归追加列表函数,python,recursion,Python,Recursion,递归函数的问题应该相对简单,但似乎不正确 我有一个文件夹结构,其中的文件夹可以包含其他文件夹、图像或文件。与每个文件夹关联的都有权限。我想让我的函数递归地构建一个和每个文件夹关联的权限列表 我有一个函数具有读取权限(请求),如果文件夹具有权限,则返回True,如果没有权限,则返回False 我构建了这样一个函数: def get_child_perms(self, folder, request, perm_list): # Folder contains other folde

递归函数的问题应该相对简单,但似乎不正确

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

我有一个函数
具有读取权限(请求)
,如果文件夹具有权限,则返回
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\u child\u perms()
将返回 [真,假,真,真] 甚至 [真,[假,真],真]

编辑

忽略编辑->询问其他问题

改变了一点

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

就地列表方法返回
None
,提醒您它们在原地操作

而不是:

return permlist.append(self.get_child_perms(...  # etc.
尝试:


编辑以添加:正如其他注释/答案所指出的,如果您希望完成
for
循环,您将希望返回到该循环之外。

就地列表方法返回
None
,以提醒您它们在原地运行

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

return permlist.append(self.get_child_perms(...  # etc.
尝试:

编辑为添加:正如其他评论/答案所指出的,如果您想完成
for
循环,您需要返回到
循环之外

for subfolder in folder.get_children():
    perm_list.append(self.get_child_perms(subfolder, request, perm_list))
return perm_list
.append
已就位。它不返回任何内容。因此您得到的是
None


.append
已就位。它不返回任何内容。因此您得到的是
None

正如所指出的那样,append是一个不返回任何内容的就地操作,您可以通过返回一个列表comp来避免使用
append

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)]

您也不需要else,因为您只能从函数中返回一次。

正如所指出的那样,append是一种不返回任何值的就地操作,您可以通过返回列表comp来避免使用
append

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)]

您也不需要else,因为您只能从函数返回一次。

尝试回答这个问题,如果
文件夹为
,是否会执行
for
循环体。get_children()
返回并清空iterable?是否确实要
在循环中返回
?这将使它在最多一次迭代后退出。你删除了循环中的返回。我不理解你最近的编辑。如果这里有人解决了您的问题(即,您不再获得
),您应该标记一个已接受的答案。如果你有一个新问题,可以问一个新问题,但是你不能一直编辑这个问题,直到函数按照你想要的方式工作。试着回答这个问题,如果
文件夹为
,那么
for
循环的体是否会被执行。get_children()
返回并清空iterable?你确定要
在循环中返回
吗?这将使它在最多一次迭代后退出。你删除了循环中的返回。我不理解你最近的编辑。如果这里有人解决了您的问题(即,您不再获得
),您应该标记一个已接受的答案。如果你有一个新问题,你可以问一个新问题,但你不能一直编辑这个问题,直到函数按照你想要的方式工作。这似乎是可行的,但不返回嵌套文件夹的值,只返回只包含文件的文件夹的值添加一个链接到你的代码,我认为有一种更简单的方法来做你想要的事情插件的代码,但不确定您想看到什么,因为这是django cms的插件,它基于django-filer。您真的希望基于权限返回布尔值,并且只对文件夹感兴趣吗?我想您需要
返回[folder.has_read_permission(request)]+[self.get_child_perms(子文件夹…
,如果你想要一个扁平化列表,你需要扁平化返回的列表,
itertools.chain
可以做到这似乎是可行的,但不返回嵌套文件夹的值,只返回只包含文件的文件夹的值添加一个链接到你的代码,我认为有一种更简单的方法来做你想要做的事情他有一个插件,但不确定你想看什么,因为这是django cms的插件,它基于django-filer。你真的想要基于权限返回布尔值,并且只对文件夹感兴趣吗?我想你需要
返回[folder.has_read_permission(request)]+[self.get_child_perms(子文件夹…
,如果需要展平列表,则需要展平返回的列表,
itertools.chain
即可