Categories: Python

【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__の使い方

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago