簡體   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