繁体   English   中英

Python Lark 解析器:没有我安装的版本似乎有 .pretty() 打印方法

[英]Python Lark parser: no versions I've installed seem to have the .pretty() print method

问题:

# From example at https://github.com/lark-parser/lark/blob/master/examples/json_parser.py
from lark import Lark, Transformer, v_args
parse = json_parser.parse
json_grammar = r""" ... """
### Create the JSON parser with Lark, using the LALR algorithm
json_parser = Lark(json_grammar, parser='lalr',
                   # Using the standard lexer isn't required, and isn't usually recommended.
                   # But, it's good enough for JSON, and it's slightly faster.
                   lexer='standard',
                   # Disabling propagate_positions and placeholders slightly improves speed
                   propagate_positions=False,
                   maybe_placeholders=False,
                   # Using an internal transformer is faster and more memory efficient
                   transformer=TreeToJson())

with open(sys.argv[1]) as f:
    tree = parse(f.read())
    print( tree )
    # Errors next 2 lines:
    # No: tree.pretty( indent_str="  " )
    # No: Lark.pretty( indent_str="  " )

具体错误:

  • AttributeError:类型 object 'Lark' 没有属性 'pretty'

设置:

Python 版本 = 3.8.1

在 Mac Bug Sur 上的 Miniconda 3 中

conda install lark-parser

安装 0.11.2-pyh44b312d_0

conda upgrade lark-parser

安装 0.11.3-pyhd8ed1ab_0

编辑:注意我的目标:

这里的目标不仅仅是解析 JSON; 我只是碰巧正在使用 JSON 示例来尝试学习。 我想为我在工作中处理的一些数据编写自己的语法。

编辑:为什么我相信漂亮的印刷品应该存在:

这是一个使用.pretty() function的例子,甚至包括output。 但我似乎找不到任何包含.pretty()的东西(至少通过conda): http://github.com/lark-parser/lark/blob/master/docs/json_tutorial.md

我不确定我可以在这个答案中加入其他答案中没有的内容。 我将尝试创建相应的示例:

json_parser = Lark(json_grammar, parser='lalr',
                   # Using the standard lexer isn't required, and isn't usually recommended.
                   # But, it's good enough for JSON, and it's slightly faster.
                   lexer='standard',
                   # Disabling propagate_positions and placeholders slightly improves speed
                   propagate_positions=False,
                   maybe_placeholders=False,
                   # Using an internal transformer is faster and more memory efficient
                   transformer=TreeToJson()
)

这里重要的一行是transformer=TreeToJson() 它告诉 lark 在将 Tree 归还给您之前应用 Transformer class TreeToJson 如果删除该行:

json_parser = Lark(json_grammar, parser='lalr',
                   # Using the standard lexer isn't required, and isn't usually recommended.
                   # But, it's good enough for JSON, and it's slightly faster.
                   lexer='standard',
                   # Disabling propagate_positions and placeholders slightly improves speed
                   propagate_positions=False,
                   maybe_placeholders=False,
)

然后使用.pretty方法获取Tree实例:

tree = json_parser.parse(test_json)
print(tree.pretty())

然后,您可以手动应用Transformer

res = TreeToJson().transform(tree)

现在这是一个“正常”的 python object,就像你从标准库 json 模块中得到的一样,所以可能是一个dict

Lark构造的transformer=选项使它可以在创建树之前完成,从而节省时间和 memory。

Lark 示例目录中的 JSON 解析器使用树变换器将解析后的树转换为普通的 JSON object。 这使得可以通过将其与 Python 标准库中的 JSON 解析器进行比较来验证解析是否正确:

    j = parse(test_json)
    print(j)
    import json
    assert j == json.loads(test_json)

只有当parse返回的值与 json.loads 返回的json.loads类型相同时,最后的assert才能通过,这是一个普通的未经修饰的array内置类型,通常是dict .

您可能会在 Python 标准库中找到对这个特定应用程序有用的漂亮打印机 或者您可以使用带有非零indent关键字参数的内置JSON.dumps function。 (例如: print(json.dumps(json_value, indent=2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM