首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TatSu:转储为YAML时的yaml.representer.RepresenterError

TatSu:转储为YAML时的yaml.representer.RepresenterError
EN

Stack Overflow用户
提问于 2019-11-23 07:55:11
回答 1查看 195关注 0票数 0

我有一个由TatSu在成功解析后生成的对象模型。使用JSON格式OK将模型转储到stdout。但是当我尝试将它转储到YAML时,我得到了一个RepresenterError异常。我不确定如何解决这个问题。对象模型是由TatSu在内部生成的。有没有人能说明如何潜在地解决这个错误?

使用python 3.7.0和TatSu v4.4.0以及pyyaml 5.1.2。

我的代码:

代码语言:javascript
复制
import sys
import json
import datetime
import tatsu

from tatsu.ast import asjson
from tatsu.objectmodel import Node
from tatsu.semantics import ModelBuilderSemantics
from tatsu.exceptions import FailedParse

class ModelBase(Node):
    pass

class MyModelBuilderSemantics(ModelBuilderSemantics):
    def __init__(self, context=None, types=None):
        types = [
            t for t in globals().values()
            if type(t) is type and issubclass(t, ModelBase)
        ] + (types or [])
        super(MyModelBuilderSemantics, self).__init__(context=context, types=types)

def main():

    sys.setrecursionlimit(10000)
    grammar = open('STIL1999.ebnf.working').read()
    parser = tatsu.compile(grammar, semantics=MyModelBuilderSemantics(), asmodel=True)
    assert (parser is not None)

    try:
        start = datetime.datetime.now()
        ast = parser.parse(open(sys.argv[1]).read(), filename=sys.argv[1])
        finish = datetime.datetime.now()
        print('Total = %s' % (finish - start).total_seconds())

        print(json.dumps(asjson(ast), indent=2))
    except FailedParse as e:
        print('Parse error : %s' % e.message)
        print(e.buf.line_info(e.pos))
        return 1

    from tatsu.yaml import ast_dump
    ast_dump(ast, stream=open('foo.yaml', 'w'))

    return 0

if __name__ == '__main__':
    sys.exit(main())

输出:

代码语言:javascript
复制
Total = 0.007043
{
  "__class__": "StilSession",
  "version": {
    "ver": 1.0
  },
  "header": {
    "__class__": "Header",
    "objs": [
      {
        "k": "Title",
        "v": "foo.gz"
      },
      {
        "k": "Date",
        "v": "Mon Nov  4 02:48:48 2019"
      },
      {
        "k": "Source",
        "v": "foo.gz"
      },
      {
        "k": "History",
        "objs": [
          {
            "__class__": "Annotation",
            "ann": " This is a test "
          }
        ]
      }
    ]
  },
  "blocks": []
}
Traceback (most recent call last):
  File "./run.py", line 57, in <module>
    sys.exit(main())
  File "./run.py", line 52, in main
    ast_dump(ast, stream=open('foo.yaml', 'w'))
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/tatsu/yaml.py", line 50, i
n ast_dump
    return dump(data, object_pairs_hook=AST, **kwargs)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/tatsu/yaml.py", line 33, i
n dump
    **kwds
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/__init__.py", line 29
0, in dump
    return dump_all([data], stream, Dumper=Dumper, **kwds)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/__init__.py", line 27
8, in dump_all
    dumper.represent(data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 27, in represent
    node = self.represent_data(data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 58, in represent_data
    node = self.yaml_representers[None](self, data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 231, in represent_undefined
    raise RepresenterError("cannot represent an object", data)
yaml.representer.RepresenterError: ('cannot represent an object', <tatsu.synth.StilSession object at 0x7ffff6
8e8f98>)
EN

回答 1

Stack Overflow用户

发布于 2019-12-25 22:49:07

此问题已由TatSu pull request #146中的OP解决

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59003265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档