[python ast.literal_eval()] ValueError: malformed node or string の対処法

記事内に広告が含まれています。
スポンサーリンク

ast.literal_eval() を利用して集合を生成する際に現れたエラーの原因・対処法についてまとめます。

スポンサーリンク

やろうとしたこと

空の集合を文字列から生成しようとした際、タイトルのエラーが発生しました。

import ast
ast.literal_eval("set()")

>ValueError: malformed node or string: <_ast.Call object at 0x7f80f4121f10>

ast はpythonの標準ライブラリの一つです。このうちのメソッドの一つである ast.literal_eval() は、文字列をリストや辞書に変換する際に利用できます。

結論

pythonのバージョンが3.8以下の場合、ast.literal_eval() で空の集合を生成することができないようです。

どうしても空の集合を作成したい場合は、ast.literal_eval() を介さずに生成するか、もしくはリストを生成した後に集合に変更するなどの工夫が必要そうです。

a = set()                       #ast.literal_eval()を介さずに生成
a = set(ast.literal_eval("[]")) #空リストを生成後に集合へ変換

注意: 3.9以上は作成可能

pythonのバージョンが3.9以上の場合は、以下の書き方で空の集合を生成できるようです。

ast.literal_eval("set()") #3.9以上から対応

バージョン 3.9 で変更: Now supports creating empty sets with 'set()'.

公式ドキュメントより

まとめ

ast.literal_eval で空の集合を生成しようとした際につまづいた点に関してメモしました。

Python
スポンサーリンク