[英]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=" " )
具體錯誤:
設置:
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.