Python ast.literal_eval()で安全に文字列をリストや辞書に変換する


 

Pythonで文字列として表現されたリストや辞書、数値、ブール値などを、実際のPythonオブジェクトに変換したい場合があります。しかし、安易にeval()関数を使うと、セキュリティ上のリスクが生じる可能性があります。そこで登場するのが、より安全な**ast.literal_eval()**です。

 

eval()の危険性

 

Pythonの組み込み関数eval()は、文字列をPythonの式として評価し、その結果を返します。非常に強力ですが、悪意のある文字列が渡された場合、システムコマンドを実行したり、ファイルシステムにアクセスしたりするコードが実行されてしまう可能性があります。

Python
 
# 危険な例: ユーザーからの入力を eval() で直接評価してはいけません
# user_input = "__import__('os').system('rm -rf /')" # 仮にこのような入力があった場合
# eval(user_input) # 非常に危険!

 

ast.literal_eval()とは?

 

astモジュールは、Pythonのソースコードを抽象構文木(Abstract Syntax Tree; AST)に変換するためのモジュールです。ast.literal_eval()は、このモジュールに含まれる関数で、文字列リテラル(文字列、数値、リスト、タプル、辞書、ブール値、Noneなど)のみを安全に評価し、Pythonオブジェクトに変換します。eval()のように任意のPythonコードを実行するリスクがありません。

 

ast.literal_eval()の使用例

 

文字列として保存されたリストや辞書を変換する際に非常に便利です。

Python
 
import ast

# 文字列のリスト
list_str = "[1, 2, 'hello', True, None]"
my_list = ast.literal_eval(list_str)
print(my_list)      # 出力: [1, 2, 'hello', True, None]
print(type(my_list)) # 出力: <class 'list'>

# 文字列の辞書
dict_str = "{'name': 'Alice', 'age': 30, 'city': 'New York'}"
my_dict = ast.literal_eval(dict_str)
print(my_dict)      # 出力: {'name': 'Alice', 'age': 30, 'city': 'New York'}
print(type(my_dict)) # 出力: <class 'dict'>

# その他のリテラル
int_str = "12345"
my_int = ast.literal_eval(int_str)
print(my_int)      # 出力: 12345
print(type(my_int)) # 出力: <class 'int'>

bool_str = "False"
my_bool = ast.literal_eval(bool_str)
print(my_bool)      # 出力: False
print(type(my_bool)) # 出力: <class 'bool'>

 

変換できない不正な文字列

 

ast.literal_eval()は、Pythonのリテラルとして認識できない文字列や、意図しないコードが含まれている文字列に対してはValueErrorを発生させます。

Python
 
import ast

# 不正な文字列の例
invalid_str = "print('Hello')" # 実行可能なコードが含まれている
try:
    ast.literal_eval(invalid_str)
except ValueError as e:
    print(f"エラー: {e}")

# 不適切な形式の例
malformed_list_str = "[1, 2, a]" # a が未定義変数
try:
    ast.literal_eval(malformed_list_str)
except ValueError as e:
    print(f"エラー: {e}")

ast.literal_eval()は、信頼できないソースから取得した文字列データをPythonオブジェクトに安全に変換するための標準的かつ推奨される方法です。設定ファイルの読み込み、APIからのJSONライクな文字列のパースなど、幅広いユースケースで活用できます。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座