我们有一个用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对象来做太多事情?
答案 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也许......很难用这条线测试......但这可能就是你要找的东西