は、これはかなり興味深いケースである:
>>> def func():
... exec('print "hi from func"')
... def subfunction():
... return True
...
File "<stdin>", line 2
SyntaxError: unqualified exec is not allowed in function 'func' because
it contains a nested function with free variables
これはsubfunction
が自由変数が含まれていることである、とPython 2であるため、exec
は、理論的には含むで地元の人々を変更することができ、実際に動作しない理由変数がグローバル関数スコープまたは親関数スコープからバインドされるべきかどうかを判断することは不可能です。 PythonのZenの節の1つはです。「あいまいさに直面して、推測する誘惑を拒否してください。」これはPython 2の機能です。
ここで、問題は、この非結合変数は何ですか?さて、それはTrue
です!
確かにそれはNone
で再生可能です:None
がに割り当てることができないにもかかわらず
>>> def func():
... exec('print "hi from func"')
... def subfunction():
... return None
...
File "<stdin>", line 2
SyntaxError: unqualified exec is not allowed in function 'test2' because it contains a nested
function with free variables
、それはバイトコードで定数とみなされ、バグのパーサは、それはここに結合していない変数であると考えています。
しかし、あなたが1
と交換し、それが問題なく動作するかどうか:
>>> def test2():
... exec('print "hi from func"')
... def subfunction():
... return 1
...
>>>
明示的exec
で使用されるグローバル、おそらく地元の人を指定し、このエラーを回避するには、言う:
>>> def test2():
... exec 'print "hi from test2"' in {}
... def subfunction():
... return None
...
>>>
exec
は、単純な関数であり、パーサまたはバイトコードコンパイラによって特別に処理されません。 Python 3ではexec
は関数ローカル名を再バインドできないため、このSyntaxErrorとあいまい性は存在しません。 3互換性対のPython 2で
一つ特有場合は、Python 2.7 documentationフォームexec(expr, globals, locals)
がexec expr in globals, locals
と等価である
形態exec(expr, globals)
が、exec expr in globals
と同等であることを述べながら、ということです。 exec
のタプル形式は、Python 3との互換性を提供します。exec
はステートメントではなく関数です。
タプルの形式は、a bug in handling of exec
in functions with nested functions (issue 21591)のように、常に100%互換ではありませんでした。 Python 2.7.8まで、次のコードで例外がスローされた可能性があります。
def func():
exec('print "hi from test2"', {})
def subfunction():
return None
これはPython 2.7で修正されました。9そしてそれはもはや投げません。
'import * from ... 'にも同じ制限があります。 – osa
は私には見えますが、補語はサブ関数と見なされます。 – dbliss