pythonopenstack-shade

Idiomatic way to to match against list of munch.munch objects?


I am using the openstack shade library to manage our openstack stacks. One task is to list all stacks owned by a user (for example to then allow for deletion of them).

The shade library call list_stacks() returns a list of munch.Munch objects, and basically I want to identify that stack object that has either an 'id' or 'name' matching some user provided input.

I came up with this code here:

def __find_stack(self, connection, stack_info):
        stacks = connection.list_stacks()
        for stack in stacks:
            if stack_info in stack.values():
                return stack
        return None

But it feels clumsy, and I am wondering if there is a more idiomatic way to solve this in python? (stack_info is a simple string, either the "name" or "id", in other words: it might match this or that entry within the "dict" values of the munched stack objects)


Solution

  • As my comment suggests, I don't really think there is something to improve.

    However, performance-wise, you could use filter to push the loop down to C level which may be beneficial if there are a lot of stacks.

    Readability-wise, I don't think that you would gain much.

    def __find_stack(self, connection, stack_info):
        stacks = connection.list_stacks()
        return list(filter(lambda stack: stack_info in stack.values(), stacks))
    

    However this approach is not "short-circuited". Your original code stops when it finds a match, and this one will not, so in theory you will get more than one match if they exist (or an empty list in case there is no match).