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