この記事では、Pythonで文字列を式として評価する方法を解説します。
単一の式を含んだ文字列を評価するにはeval
関数、複数行の文字列をコードとして実行するにはexce
関数を使います。どちらも組み込み関数です。
それでは、使い方を見ていきましょう!
スポンサーリンク
文字列を式として実行する
eval
関数の引数に式を文字列として引き渡すことでPythonの式として評価されます。評価された式の結果は戻り値として受け取ることができます。
r = eval('1 + 2')
print(r) # 3
変数も使用可能です。
x = 10
r = eval('x + 2')
print(r) # 12
複数行の文字列を評価したい場合はexec
関数を使います。
exec('''
x = 1
y = 2
r = x + y
''')
print(r) # 3
eval
関数とexce
関数の違いは以下のとおりです。
eval関数
- 1行の文字列を評価
- 結果を戻り値として返す
- 外部の変数を使用可能
exce関数
- 複数行の文字列を実行できる
- 戻り値はNone
- 外部の変数を使用可能
- 内部で生成した変数を外部で使用可能
組み込みの制限
eval
関数やexec
関数のglobals
引数を指定することで評価する文字列内での組み込みの機能を制御することができます。
import copy
# eval関数で使用する変数
x = 0
# 元の__builtins__に影響を与えないようにコピーを受け取る
b = copy.copy(__builtins__.__dict__)
# 組み込み関数の削除
del b['id']
# モジュールの名前空間の代入
g = globals()
# __builtins__に先程のbを代入
g['__builtins__'] = b
# eval関数で使用するglobalsにgを指定
e = eval('id(x)', g)
print(e)
実行結果
Traceback (most recent call last):
File "main.py", line 18, in
e = eval('id(x)', g)
File "", line 1, in
NameError: name 'id' is not defined
上記の例では、__builtins__
からid
関数を削除して式中で制限しました。
まとめ
この記事では、文字列を動的に式として実行する方法を解説しました。
eval
関数は、クラスに定義している__repr__
メソッドの文字列を使って元のオブジェクトを再生成するのに使われたりします。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ