如何基于字符串变量entry在ruamel加载的GitHub YAML指定层级查找内容?
没问题,既然你已经用ruamel把YAML文件稳稳加载好了,那咱们直接来搞定这个查找逻辑就行。先给你理清楚思路,再上实用的代码:
1. 先搞懂ruamel加载后的对象类型
ruamel加载YAML后,顶层是个类似字典的CommentedMap对象,而示例里的depends对应的是CommentedSeq(和普通列表用法差不多),里面每个元素又是CommentedMap。所以咱们完全可以像操作普通字典、列表那样去访问,不用额外转换。
2. 基础版查找函数(找到第一个匹配项就返回)
假设你的类里已经存了加载好的YAML数据(比如叫self.yaml_data),函数里的entry就是要找的键名(比如"image"、"basetag"),直接写这个函数就行:
def find_entry_content(self, entry): # 先查顶层的键 if entry in self.yaml_data: return self.yaml_data[entry] # 再查depends列表里的每个子项 if 'depends' in self.yaml_data: for item in self.yaml_data['depends']: if entry in item: return item[entry] # 要是都没找到,返回None或者你自己定义的默认值 return None
3. 进阶版:收集所有匹配的结果
如果entry可能在多个层级出现(比如顶层的image和depends里的image),想要把所有结果都收集起来,就改成这个版本:
def find_all_entry_content(self, entry): results = [] # 先把顶层匹配的加进去 if entry in self.yaml_data: results.append(self.yaml_data[entry]) # 再遍历depends里的每个子项,把匹配的也加进去 if 'depends' in self.yaml_data: for item in self.yaml_data['depends']: if entry in item: results.append(item[entry]) # 有结果就返回列表,没结果返回None return results if results else None
4. 几个小提醒
- 一定要先判断
depends这个键是否存在,不然万一YAML里没有这个字段,直接访问会抛出KeyError - ruamel的
CommentedMap和普通字典的用法几乎完全一致,所以不用特意转成普通字典再操作 - 如果你的YAML结构比示例更复杂(比如嵌套了更多层),可以把查找逻辑改成递归的,不过看你给的示例,上面的代码应该完全够用了
内容的提问来源于stack exchange,提问作者TripodNH
相关产品推荐
相关产品推荐

