如何在使用construct_mapping和add_constructor时有效地从YAML

我正在使用pyyaml(版本:5.1)Python 2来解析传入 POST API 请求的YAML数据正文。

传入请求的正文包含一些 Unicode 对象以及一些字符串对象。

链接中给出的解决方案用于将 YAML 映射加载到 OrderedDict 中其中引用传入的 POST API 请求的YAML数据正文。

但是,我必须使用从某些仅接受字符串对象的库的链接生成的 OrderedDict 。

我无法更改库也无法更新它,我必须使用 Python 2。

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

  1. 获取从链接生成的 OrderedDict

  2. 递归地解析它,将任何找到的 Unicode 对象转换为 String 对象

其示例代码如下,

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

尽管这可行,但该解决方案效率不高,因为完整的 OrderedDict 在创建后才被解析。

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


回首忆惘然
浏览 74回答 1
1回答

PIPIONE

您可以提供一个自定义构造函数,该构造函数始终将 YAML!!str标量加载到 Python unicode 字符串:import yamlfrom yaml.resolver import BaseResolverdef unicode_constructor(self, node):  # this will always return a unicode string;  # the default loader would convert it to ASCII-encoded str if possible.  return self.construct_scalar(node)yaml.add_constructor(BaseResolver.DEFAULT_SCALAR_TAG, unicode_constructor)之后,yaml.load将始终返回 unicode 字符串。(代码未经测试,因为我没有安装 Python 2)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python