yaml转python对象

学习

Posted by simplex on April 17, 2022

问题描述

在使用python读取yaml的时候遇到问题,已知 yaml 文件,如何将其转化为 python 中的一个类。下面是一个yaml文件。

MUTAG:
  batch_size: 64
  batchnorm_dim: 28

解决

首先,我使用了 pyyaml 包,pyyaml 不能直接将 yaml 文件读取为类。

1 改变yaml格式

根据 pyyaml 的官方 doc,在 Loading YAML 部分有如下方式:

>>> class Hero:
...     def __init__(self, name, hp, sp):
...         self.name = name
...         self.hp = hp
...         self.sp = sp
...     def __repr__(self):
...         return "%s(name=%r, hp=%r, sp=%r)" % (
...             self.__class__.__name__, self.name, self.hp, self.sp)
>>> yaml.load("""
... !!python/object:__main__.Hero
... name: Welthyr Syxgon
... hp: 1200
... sp: 0
... """)

Hero(name='Welthyr Syxgon', hp=1200, sp=0)

首先,可以看出,pyyaml 的作者是一个 RPG 游戏爱好者。不过我没有查到 Welthyr Syxgon 是什么东西。

其次,根据上面的方法,我们也可以模仿上面

  • 在 py 文件当中定义一个类,类中属性包含了所有 yaml 中的对象
  • 在 yaml 中以!!python/object:__main__.你的类名开头

评价

两边都要定义,比较麻烦。不够优美。具体我也没有深究细节。

2 间接转化

首先读取 yaml 文件为 dict,再将其转化为 类。

这里面有很多方法,stackoverflow: 将 yaml 转化为 python 类stackoverflow: python 将 dict 转化为 object

下面是高赞回答的方式:

通过 pyyaml 将其读取为 dict

import yaml
with open('config.yaml') as f:
    # use safe_load instead load
    dataMap = yaml.safe_load(f)

创建中间类,目的是将 dict 转化为这个类

class Struct:
    def __init__(self, **entries): 
        self.__dict__.update(entries)

转化

# 注意这里的参数
args = Struct(**dataMap)

然后这个 args 就是想要的类了

其他

根据其他的回答,还有专门用于转化的库。详情见上面的链接。

总结

以上是两种简单的将 yaml 文件转化为 python 类的方法,里面有一些细节可能有错误。权当是一种思路吧。