Philippe Fisher
Philippe Fisher

Reputation: 596

Python Recursive function missing results

Coming from Python recursively appending list function Trying to recursively get a list of permissions associated with a file structure.

I have this 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)

That returns all the results except the folders that contain other folders.

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

Output from function would be [True, False, False]

another case would be, where A = allowed, R = restricted

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

Output would be [True,True,False,False,True,True,True]

Upvotes: 3

Views: 319

Answers (2)

Luka Rahne
Luka Rahne

Reputation: 10447

why not 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 example you can build generator (lazy list) that generates only non restricted directories

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

Upvotes: 0

Anand S Kumar
Anand S Kumar

Reputation: 90889

The basic issue occurs you are only returning the folder permission , when folder does not have any children , when it has children, you are not including the folder.has_read_permission(request) in your return result , which is most probably causing you issue. You need to do -

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

This should result in (not tested) -

[folderperm [subfolderperm [subsubfolderperm]]

Upvotes: 3

Related Questions