Python はじめました:組み込み関数 compile: 引数 mode=

Python.use(better) # Python はじめました記事一覧
組み込み関数 compile: 引数 mode=

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

引数 mode="eval"

引数 mode="eval" を指定すると、source= に有効な「式」を記述できます。

>>> code = compile("a+4","","eval")
>>> eval(code)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 

空文字列 filename="" を指定すると、エラーメッセージから詳細な情報が得られません。そこで、

>>> code = compile("a+4","ex.py","eval")
>>> eval(code)
Traceback (most recent call last):
  File "", line 1, in 
  File "ex.py", line 1, in 
NameError: name 'a' is not defined

引数 filename="ex.py" を指定すると、より詳細な情報が得られます。ここでは、変数 a が未定義なので、式を評価できません。例外 NameError を生成して、エラーメッセージを出力します。そこで、

>>> a = 3
>>> eval(code)
7

変数 a に値 3 を設定すると、式 "a+4" を評価して値 7 が得られます。

>>> code = compile("a=3","ex.py","eval")
Traceback (most recent call last):
  File "", line 1, in 
  File "ex.py", line 1
    a=3
     ^
SyntaxError: invalid syntax

引数 mode="eval" では、有効でない「式」を指定すると、例外 SyntaxError を生成して、エラーメッセージを出力します。この問題を解消するのが、次に示す mode="single" です。

引数 mode="single"

引数 mode="eval" を指定すると、source= に有効な「文」を記述できます。

>>> code = compile("a=3","ex.py","single")
>>> eval(code)
    
ただし、文は値を返さないので、何も出力されません。そこで、
>>> a
3
変数 a の値を確認すると、3 になっているのが分かります。または、次のように、
>>> code = compile("a=4;a","ex.py","single")
>>> eval(code)
4
複数の式をセミコロン「;」で続けても、変数 a の値を確認できます。
>>> code = compile("for e in range(3): print(e)","ex.py","single")
Traceback (most recent call last):
  File "", line 1, in 
  File "ex.py", line 1
    for e in range(3): print(e)
                             ^
SyntaxError: unexpected EOF while parsing
引数 mode="single" では、有効でない「文」を指定すると、例外 SyntaxError を生成して、エラーメッセージを出力します。この問題を解消するのが、次に示す mode="exec" です。

引数 mode="exec"

引数 mode="exec" を指定すると、source= に有効な「モジュール」を記述できます。
>>> code = compile("for e in range(3): print(e)","ex.py","exec")
>>> eval(code)
0
1
2
for に続く制御変数 e の値が、順に出力されます。
Last updated♪09/03/16