Python 在使用construct_映射和add_构造函数时,如何从YAML高效地获取字符串对象而不是Unicode?

Python 在使用construct_映射和add_构造函数时,如何从YAML高效地获取字符串对象而不是Unicode?,python,python-2.7,yaml,pyyaml,Python,Python 2.7,Yaml,Pyyaml,我正在使用pyyaml(版本:5.1)和python2解析传入POST-API请求的YAML数据体 传入请求的主体包含一些Unicode对象以及一些字符串对象 中给出的解决方案用于将YAML映射加载到OrderedDict,其中流指的是传入的POST API请求的YAML数据体 但是,我必须将从生成的OrderedDict与一些只接受字符串对象的库一起使用。 我无法更改或更新库,只能使用Python 2。 目前正在使用的解决方案是 获取从 递归地解析它,转换发现的任何出现的Unicode 对象转

我正在使用pyyaml(版本:5.1)python2解析传入POST-API请求的YAML数据体

传入请求的主体包含一些Unicode对象以及一些字符串对象

中给出的解决方案用于将YAML映射加载到OrderedDict,其中指的是传入的POST API请求的YAML数据体

但是,我必须将从生成的OrderedDict与一些只接受字符串对象的库一起使用。

我无法更改或更新库,只能使用Python 2。

目前正在使用的解决方案是

  • 获取从
  • 递归地解析它,转换发现的任何出现的Unicode 对象转换为字符串对象
  • 其示例代码如下所示

    def convert(data):
        if isinstance(data, unicode):
            return data.encode('utf-8')
        if isinstance(data, list):
            return [convert(item) for item in data]
        if isinstance(data, dict):
            newData = {}
            for key, value in data.iteritems():
                newData[convert(key)] = convert(value)
            return newData
         return data
    
    虽然这是可行的,但解决方案并不高效,因为完整的OrderedICT是在创建之后解析的


    是否有一种方法可以在生成OrderedICT之前或期间完成数据转换,以避免再次解析它?

    您可以提供一个自定义构造函数,该构造函数将始终加载YAML
    !!str
    标量到Python unicode字符串:

    导入yaml
    从yaml.resolver导入BaseResolver
    def unicode_构造函数(自身,节点):
    #这将始终返回unicode字符串;
    #如果可能,默认加载程序会将其转换为ASCII编码的str。
    返回self.construct\u标量(节点)
    yaml.add_构造函数(BaseResolver.DEFAULT_SCALAR_标记,unicode_构造函数)
    
    之后,
    yaml.load
    将始终返回unicode字符串


    (代码未经测试,因为我没有安装Python 2)

    建议的代码运行良好,但我找不到关于add_构造函数用法的好文档。请你也指出这一点好吗?这本书描述了它的一般用法,但没有详细说明。坦率地说,关于如何使用PyYAML,我所知道的大部分事情都来自于阅读它的源代码和了解如何描述文件的加载过程(在第3章中介绍)。