Python PR

【Python】文字列を式として評価する方法

記事内に商品プロモーションを含む場合があります

この記事では、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__メソッドの文字列を使って元のオブジェクトを再生成するのに使われたりします。

__str__と__repr__の使い方

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ