【问题标题】:How to turn Perl blessed objects into YAML that Python can read如何将 Perl 祝福对象转换为 Python 可以读取的 YAML
【发布时间】:2014-04-08 22:20:48
【问题描述】:

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

这就是问题所在——如果我只是通过 Dancer 的序列化传回一个常规的旧 perl 哈希,那么一切都可以正常工作。 JSON、YAML、XML……它们都能胜任。

但是有时我们需要传回 Perl 对象,Python 稍后可以将其作为参数传回以帮助进行不必要的加载等。发现 YAML 是唯一能与 Dancer 中 Perl 的祝福对象一起工作的。

问题在于 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 对象来做太多事情?

【问题讨论】:

  • 你能把你的整个 yaml 和生成它的 perl 放进去吗?
  • 它很大,而且有一些敏感的东西——我认为我的工作不允许我这样做。 :(
  • 也许可以做一个最小的例子来演示这个问题,包括生成 yaml 的 perl 代码,并完成 yaml ......(例如,只祝福一个随机对象并给我 yaml ......我没有 perl ...)
  • 好吧,我追查到导致问题的原因--- !!perl/hash:SDB::DBIO。 YAML 文件希望在 --- 之后有“关键”部分,对吧?或者对于 Python 对象,紧随其后的是 !!python...。 PyYAML 正在崩溃,因为它在之后立即运行到 !!perl - 即使对于我的对象,如果我在将其转换为字符串或类似的东西之后解析该部分,它也可以正常工作。

标签: python perl yaml dancer


【解决方案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 可能......仅用那一行很难测试......但这可能是你正在寻找的东西

【讨论】:

  • 啊 - 这更有帮助。谢谢。
  • 这就是我要求更多 yaml 的原因...我不知道应该怎么做...
猜你喜欢
  • 2011-01-20
  • 2017-09-25
  • 2014-01-19
  • 2013-05-04
  • 1970-01-01
  • 2011-11-14
  • 2015-11-08
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多