如何将Perl祝福的对象转换为Python可以读取的YAML

时间:2014-04-08 22:20:49

标签: python perl yaml dancer

我们有一个用Perl Dancer编写的REST Web服务。它返回YAML格式的perl数据结构,并且还接收YAML格式的参数 - 它应该与其他一些使用Python查询它的团队一起工作。

这就是问题所在 - 如果我通过Dancer的序列化传回一个普通的旧perl哈希,一切都运行得很好。 JSON,YAML,XML ......他们都在做这个工作。

HOWEVER 有时我们需要传回Perl对象,以后Python可以作为参数传回来帮助进行不必要的加载等等。我玩了发现YAML是唯一一个与Perl在Dancer中被祝福的物品一起工作的人。

问题是Python的YAML无法通过Perl对象的YAML进行解析(而它可以处理常规的旧perl哈希YAML而没有问题)。

perl对象在YAML中以这样的方式开始:

第一个:

--- &1 !!perl/hash:Sequencing_API

第二

--- !!perl/hash:SDB::DBIO

这样就错了。

yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:perl/hash:SDB::DBIO'

常规文件似乎通过这样传递:

--- fields: library:

---之后的额外内容似乎导致问题。我该怎么做才能解决这个问题?或者我是否想通过传递Perl对象来做太多事情?

1 个答案:

答案 0 :(得分:1)

简短的回答是

!!tag:yaml.org,2002:的yaml简写...因此!!perl/hash确实是tag:yaml.org,2002:perl/hash

现在你需要告诉python yaml如何处理这种类型

所以你为它添加一个构造函数如下

import yaml


def construct_perl_object(loader, node):
    print "S:",suffix,"N:",node
    return loader.construct_yaml_node(node)#this is likely wrong ....



yaml.add_multi_constructor(u"tag:yaml.org,2002:perl/hash:SDB::DBIO", construct_perl_object)
yaml.load(yaml_string)

或者可能只是解析它或者返回None也许......很难用这条线测试......但这可能就是你要找的东西