【Python】eval関数とexec関数の違いや注意点を実例で解説

Python-prograshi(プロぐらし)-kv Python
記事内に広告が含まれていることがあります。

execとevalとの違い

execもevalも引数に式を指定することができ、指定した式の処理を実行することができます。ですが、execとevalは大きく次の2点が異なります。

execは文も引数にとれる

execは「文」を引数に指定することもできますが、evalは「文」を指定するとエラーになります。

文とは?式との違い

文とはイコールで結ばれた処理のことです。式とは四則演算子を用いた処理でイコールがないものです。

▼式と文の例

項目
5*2
a = 5*2

evalは文を指定するとエラーになる

eval("a = 5*2")

#出力
SyntaxError: invalid syntax


execは文を指定してもエラーにならない

exec("a=5*2")
print(a)

#出力
10



exec自体は存在しない

execの処理には戻り値(return)がないため、exec自体は存在しません。一方、eval自身は存在することができます。

  • exec自身は存在する
  • eval自身は存在しない(None)

▼存在確認

exec("2+5") is None    #True
eval("2+5") is None    #False


▼printによる確認

#execでは指定した処理がそのまま返る
exec("print(2*5)")

#出力
10
#exec自身は存在しない
print(exec("2*5"))

#出力

None


eval関数とexec関数でできることやエラー事例の詳細は以下にまとめています。

eval関数

引数に文字列で入力した式を実行する。
実行結果が戻り値として返る。

eval("式")
 └ 文だとエラー
 └ evaluation(評価)の略

a = eval("5*2")
print(a)

#出力
10



▼print
eval内でprintを実行することも、evalをprintすることも可能。

eval("print(5*2)")
print(eval("5*2"))

#出力
10
10


文字列を代入した変数を引数に使う

l=[]
s=".extend('abc')"

#文字列はクオテーション不要
eval("l"+s)
print(l)

#出力
['a', 'b', 'c']

evalの引数に文字列の変数を入れる場合はクオテーション不要


式の中で文字列を使う

文字列を使う場合は、全体を囲む記号とは別の記号を使う。
・「” の中:「’ ‘」
・「’ ‘」の中:「” “」

※同じ記号を使うと、文字列の終了と認識されエラーとなる。

a = eval("'aaa'")
b = eval('"bbb"')

print(a)
print(b)

#出力
aaa
bbb
eval(""aaa"")

#出力
SyntaxError: invalid syntax


エラーになるパターン

  • 文を入力した場合
  • 文字列以外の場合(数値など)
eval("a = 5*2")

#出力
SyntaxError: invalid syntax
eval(5*2)

#出力
TypeError: eval() arg 1 must be a string, bytes or code object
eval(a=5)

#出力
TypeError: eval() takes no keyword arguments


exec関数

引数に入力された文字列の式や文を実行する。

exec('文 or 式')
 └ executeの略
 └ exec自身の戻り値はない

exec("a=5*2")
print(a)

#出力
10
exec("a = 'hello'")
print(a)

#出力
hello
exec("a=2; b=5; c=a*b")
print(c)

#出力
10

・「;」は改行と同意

l=[1,2,3]

exec("l.extend([4,5,6])")
print(l)

#出力
[1, 2, 3, 4, 5, 6]



参考リンク

>Python公式ページ
組み込み関数
eval
exec

タイトルとURLをコピーしました