如何使用pyYAML将python元组添加到YAML文件?

发布于 2021-01-29 16:27:07

标题是不言自明的。

将元组保存到YAML文件时,得到的内容如下所示:

ambient:  !!python/tuple [0.3, 0.3 ,0.3]

当我尝试使用yaml.safe_load(file_object)加载它时,我不断收到错误消息:

yaml.constructor.ConstructorError:  could not determine a constructor for the tag 'tag:yaml.org,2002:python/tuple'

需要做什么?

关注者
0
被浏览
194
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在pyyaml中,SafeLoader不包含python本机类​​型的加载程序,仅包含yaml规范中定义的类型。你可以看到类型的SafeLoaderLoader这里下面的互动样本。

    您可以定义一个新的Loader类,该类添加了python元组,但未添加其他类型,因此它仍然非常安全:

    import yaml
    
    class PrettySafeLoader(yaml.SafeLoader):
        def construct_python_tuple(self, node):
            return tuple(self.construct_sequence(node))
    
    PrettySafeLoader.add_constructor(
        u'tag:yaml.org,2002:python/tuple',
        PrettySafeLoader.construct_python_tuple)
    
    doc = yaml.dump(tuple("foo bar baaz".split()))
    print repr(doc)
    thing = yaml.load(doc, Loader=PrettySafeLoader)
    print thing
    

    导致:

    '!!python/tuple [foo, bar, baaz]\n'
    ('foo', 'bar', 'baaz')
    

    请参阅下面的与SafeLoader和Loader类关联的构造函数。

    >>> yaml.SafeLoader.yaml_constructors
    {None: <unbound method SafeConstructor.construct_undefined>,
     u'tag:yaml.org,2002:binary': <unbound method SafeConstructor.construct_yaml_binary>,
     u'tag:yaml.org,2002:bool': <unbound method SafeConstructor.construct_yaml_bool>,
     u'tag:yaml.org,2002:float': <unbound method SafeConstructor.construct_yaml_float>,
     u'tag:yaml.org,2002:int': <unbound method SafeConstructor.construct_yaml_int>,
     u'tag:yaml.org,2002:map': <unbound method SafeConstructor.construct_yaml_map>,
     u'tag:yaml.org,2002:null': <unbound method SafeConstructor.construct_yaml_null>,
     u'tag:yaml.org,2002:omap': <unbound method SafeConstructor.construct_yaml_omap>,
     u'tag:yaml.org,2002:pairs': <unbound method SafeConstructor.construct_yaml_pairs>,
     u'tag:yaml.org,2002:seq': <unbound method SafeConstructor.construct_yaml_seq>,
     u'tag:yaml.org,2002:set': <unbound method SafeConstructor.construct_yaml_set>,
     u'tag:yaml.org,2002:str': <unbound method SafeConstructor.construct_yaml_str>,
     u'tag:yaml.org,2002:timestamp': <unbound method SafeConstructor.construct_yaml_timestamp>}
    
    >>> yaml.Loader.yaml_constructors
    {None: <unbound method SafeConstructor.construct_undefined>,
     u'tag:yaml.org,2002:binary': <unbound method SafeConstructor.construct_yaml_binary>,
     u'tag:yaml.org,2002:bool': <unbound method SafeConstructor.construct_yaml_bool>,
     u'tag:yaml.org,2002:float': <unbound method SafeConstructor.construct_yaml_float>,
     u'tag:yaml.org,2002:int': <unbound method SafeConstructor.construct_yaml_int>,
     u'tag:yaml.org,2002:map': <unbound method SafeConstructor.construct_yaml_map>,
     u'tag:yaml.org,2002:null': <unbound method SafeConstructor.construct_yaml_null>,
     u'tag:yaml.org,2002:omap': <unbound method SafeConstructor.construct_yaml_omap>,
     u'tag:yaml.org,2002:pairs': <unbound method SafeConstructor.construct_yaml_pairs>,
     u'tag:yaml.org,2002:python/bool': <unbound method Constructor.construct_yaml_bool>,
     u'tag:yaml.org,2002:python/complex': <unbound method Constructor.construct_python_complex>,
     u'tag:yaml.org,2002:python/dict': <unbound method Constructor.construct_yaml_map>,
     u'tag:yaml.org,2002:python/float': <unbound method Constructor.construct_yaml_float>,
     u'tag:yaml.org,2002:python/int': <unbound method Constructor.construct_yaml_int>,
     u'tag:yaml.org,2002:python/list': <unbound method Constructor.construct_yaml_seq>,
     u'tag:yaml.org,2002:python/long': <unbound method Constructor.construct_python_long>,
     u'tag:yaml.org,2002:python/none': <unbound method Constructor.construct_yaml_null>,
     u'tag:yaml.org,2002:python/str': <unbound method Constructor.construct_python_str>,
     u'tag:yaml.org,2002:python/tuple': <unbound method Constructor.construct_python_tuple>,
     u'tag:yaml.org,2002:python/unicode': <unbound method Constructor.construct_python_unicode>,
     u'tag:yaml.org,2002:seq': <unbound method SafeConstructor.construct_yaml_seq>,
     u'tag:yaml.org,2002:set': <unbound method SafeConstructor.construct_yaml_set>,
     u'tag:yaml.org,2002:str': <unbound method SafeConstructor.construct_yaml_str>,
     u'tag:yaml.org,2002:timestamp': <unbound method SafeConstructor.construct_yaml_timestamp>}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看