Python递归函数缺少结果

2024-03-28 14:48:21 发布

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

来自Python recursively appending list function 尝试递归地获取与文件结构关联的权限列表。你知道吗

我有这个功能:

def get_child_perms(self, folder, request, perm_list):
        # Folder contains other folders
        if folder.get_children():
            # For every sub-folder
            return [self.get_child_perms(subfolder, request, perm_list) for subfolder in folder.get_children()]
        return folder.has_read_permission(request)

返回除包含其他文件夹的文件夹以外的所有结果。你知道吗

folder <- Missing (allowed)
    subfolder <- Missing (restricted)
        subsubfolder <- Get this (restricted)
            files

函数的输出是 [真,假,假]

另一种情况是,A=允许,R=限制

folder  A
    subfolder   A
        subsubfolder    R
            files
        files
    subfolder   R
        files
    subfolder   A
        subsubfolder    A
            files
        files
    subfolder   A
        files
    files

输出将是 [真,真,假,假,真,真,真,真]


Tags: self文件夹childgetreturnrequestfilesfolder
2条回答

基本问题发生在您只返回folder permission,当文件夹没有任何子文件夹时,当它有子文件夹时,您没有在返回结果中包含folder.has_read_permission(request),这很可能是导致问题的原因。你需要做-

def get_child_perms(self, folder, request, perm_list):
        # Folder contains other folders
        if folder.get_children():
            # For every sub-folder
            return [folder.has_read_permission(request)] + [self.get_child_perms(subfolder, request, perm_list) for subfolder in folder.get_children()]
        return [folder.has_read_permission(request)]

这将导致(未测试)——

[folderperm [subfolderperm [subsubfolderperm]]

为什么不 os.walk

When topdown is True, the caller can modify the dirnames list in-place (perhaps using del or slice assignment), and walk() will only recurse into the subdirectories whose names remain in dirnames; this can be used to prune the search, impose a specific order of visiting, or even to inform walk() about directories the caller creates or renames before it resumes walk() again. Modifying dirnames when topdown is False is ineffective, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.

例如,您可以构建只生成非限制目录的生成器(惰性列表)

for (dirpath, dirnames, filenames) in os.walk("top_path"):
    if restricted(dirpath):
        del dirnames
        continue
    yield (dirpath,tuple(filenames))

相关问题 更多 >