有一个递归函数的问题应该相对简单,但看起来似乎没有问题。
我有一个包含文件夹的文件夹结构,可以包含其他文件夹,图像或文件。与每个文件夹相关联都有权限。我想让我的函数以递归方式构建一个与每个文件夹关联的权限列表。
我有一个函数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
答案 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
您不需要其他人,因为您只能从该功能返回一次。