【问题标题】:Idiomatic way to to match against list of munch.munch objects?匹配 munch.munch 对象列表的惯用方式?
【发布时间】:2018-12-17 11:54:02
【问题描述】:

我正在使用 openstack shade 库来管理我们的 openstack 堆栈。一项任务是列出用户拥有的所有堆栈(例如,然后允许删除它们)。

阴影库调用list_stacks() 返回munch.Munch 对象的列表,基本上我想识别具有与某些用户提供的输入匹配的“id”或“名称”的堆栈对象。

我在这里想出了这段代码:

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

但是感觉很笨拙,我想知道在python中是否有更惯用的方法来解决这个问题? (stack_info 是一个简单的字符串,可以是“name”或“id”,换句话说:它可能匹配被咀嚼的堆栈对象的“dict”值中的这个或那个条目)

【问题讨论】:

  • 鉴于附加信息,我认为这种方法没有任何错误或笨拙,我不明白为什么有人会认为这不是惯用的。如果stack_info 是一本字典,您可能已经使用了一些set 操作,但这可能有点过头了。无论如何,恕我直言,您的方式是完全可以接受的。您可以考虑使用map 使其更短,但这会损害可读性。

标签: python openstack-shade


【解决方案1】:

正如我的评论所暗示的,我真的认为有什么需要改进的地方。

但是,在性能方面,您可以使用 filter 将循环推到 C 级别,如果有很多 stacks,这可能是有益的。

就可读性而言,我认为您不会有太多收获。

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

但是,这种方法不是“短路的”。您的原始代码在找到匹配项时会停止,而这个不会,因此理论上如果存在匹配项,您将获得多个匹配项(如果没有匹配项,则为空列表)。

【讨论】:

  • 真的很好很周到!
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多