【Python】 Python ~ 基本編 / astモジュール ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/10/05/105550

で、json化するのに普段は、json.loads()を使っていたのだが
astモジュールってのがあるのは知らなかった。

目次

【1】astモジュール
【2】literal_eval()
 1)json.loads() との違い
【3】サンプル
 例1:literal_eval()

【1】astモジュール

https://docs.python.org/ja/3.7/library/ast.html

より抜粋
~~~~~~
ast --- 抽象構文木

ast モジュールは、Python アプリケーションで
 Python の抽象構文木を処理しやすくするものです。
~~~~~~

抽象構文木(英: Abstract Syntax Tree; AST)

* 構造を木 (Tree) の形で表したもの

【2】literal_eval()

* 文字列をリストや辞書に変換

https://docs.python.org/ja/3.7/library/ast.html#ast.literal_eval

1)json.loads() との違い

* json.loads() は、JSONから外れた形式は変換できない
* ast.literal_eval() は、変換可能
 => 処理対象の仕様によって、使い分ければいい。

変換対象1)True/False, None

* json.loads() : NG
* ast.literal_eval() : OK

変換対象2)true/false, null

* json.loads() : OK
* ast.literal_eval() : NG

【3】サンプル

例1:literal_eval()

import ast

# ex1: List
print("ex1: List")
string_value = '["a","b","c"]'
list = ast.literal_eval(string_value)
for value in list:
  print(f"value={value}")

# ex2: Dict
print("ex2: Dict")
string_value = '{"key1": 10, "key2": True}'
dict = ast.literal_eval(string_value)
for index, (key, value) in enumerate(dict.items()):
  print(f"index={index}, key={key}, value={value}")

# ex3: JSON
print("ex3: JSON")
string_value = '{ "Name": "Mike", "active": True, "friends": [ { "name": "Tom" } ]}, { "Name": "Sam" }'
json = ast.literal_eval(string_value)
for value in json:
  print(f"value={value}")

出力結果

ex1: List
value=a
value=b
value=c
ex2: Dict
index=0, key=key1, value=10
index=1, key=key2, value=True
ex3: JSON
value={'Name': 'Mike', 'active': True, 'friends': [{'name': 'Tom'}]}
value={'Name': 'Sam'}

参考文献

https://note.nkmk.me/python-ast-literal-eval/

では、json.loads()との違いも書いてあって非常に勉強になった。
感謝。。。

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / JSON
https://dk521123.hatenablog.com/entry/2019/10/19/104805
辞書
https://dk521123.hatenablog.com/entry/2019/10/27/100014
辞書・あれこれ
https://dk521123.hatenablog.com/entry/2020/10/11/000000
機密データの管理 ~ Secrets Manager / boto3 編 ~
https://dk521123.hatenablog.com/entry/2021/10/05/105550