実行() 関数は、文字列またはオブジェクト コードのいずれかである Python プログラムを動的に実行するために使用されます。文字列の場合、その文字列は一連の Python ステートメントとして解析され、構文エラーが発生しない限り実行され、オブジェクト コードの場合は単純に実行されます。 return ステートメントは、exec() 関数に渡されるコードのコンテキスト内だけでなく、関数定義の外でも使用できないことに注意する必要があります。値を返さないため、戻り値が返されます なし 。
Python exec() 構文
exec(オブジェクト[, グローバル[, ローカル]])
パラメーター:
- 物体: すでに述べたように、これは文字列またはオブジェクトコードにすることができます
- グローバル: これは辞書にすることができ、パラメータはオプションです
- 地元の人々: これはマッピング オブジェクトにすることができ、オプションでもあります
Python で exec() はどのように動作するのでしょうか?
この例では、exec()>
関数。これは、オブジェクトに含まれるコードを動的に実行する機能を示し、Python での動的実行の概念を示します。
Python3
prog> => 'print('The sum of 5 and 10 is', (5+10))'> exec> (prog)> |
>
>出力
Javaの区切り文字
The sum of 5 and 10 is 15>
警告または制限事項
exec() 関数内でメソッドを使用する前に、すべての関数が exec() で何をサポートしているのかを念頭に置く必要があります。これを表示するには、 dir() 関数を使用します。
この例では、Python での動的実行を次のように見ることができます。dir()>
関数は内で実行されますexec()>
Python での動的実行の概念を示す関数。
Python3
# The math class is used to include all the> # math functions> from> math> import> *> exec> (> 'print(dir())'> )> |
>
>出力
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']>
グローバルパラメータとローカルパラメータ
Python では、不要な可能性があるグローバル パラメーターとローカル パラメーターを使用して、さまざまな変数やメソッドの使用を制限できます。これらのローカルおよびグローバル パラメーターは、主に辞書のローカル変数またはグローバル変数に使用されます。ローカルパラメータが欠落している場合、グローバルパラメータが上回ります。これは、両方のフィールドにグローバルパラメータを使用できることを意味します。グローバル パラメーターのみを渡してコードがどのように動作するかを見てみましょう。
Python3
# Here we have passed an empty dictionary> from> math> import> *> exec> (> 'print(dir())'> , {})> |
ベルフォードアルゴリズム
>
>出力
['__builtins__']>
したがって、空の辞書をグローバル パラメーターとして渡すと、__builtins__ のみが表示され、前の例のように他の数学関数は表示されないことがわかります。これは、オブジェクト パラメーターとして __builtins__ のみがサポートされることを意味します。これは、他のすべての機能がオブジェクトで制限されていることを示唆しています。それを証明するために、数学関数を使って何が起こるか見てみましょう。
Python3
# An exception will be raised> from> math> import> *> exec> (> 'print(factorial(5))'> , {})> |
>
>
この例では、出力として 120 が出力されるはずですが、代わりに「出力なし」と表示され、例外が発生します。数学モジュールをインポートしましたが、グローバル パラメーターを渡すことで設定した制限のため、factorial() メソッドは機能しませんでした。
多くの関数のうちのいくつかを実行できるようにすることもできます。 Factorial() 関数を除く他のすべての数学モジュールを制限したいとします。
Python3
# factorial() will be executed> from> math> import> *> exec> (> 'print(factorial(5))'> , {> 'factorial'> :factorial})> |
>
>出力
120>
これらの事前定義されたメソッドの名前を変更し、実行中にユーザー定義の名前を付けることもできます。関数の名前はから変更できます 階乗() に 事実() 、これはユーザー定義です。
Python3
# factorial() renamed as fact> from> math> import> *> exec> (> 'print(fact(5))'> , {> 'fact'> : factorial})> |
>
>出力
120>
このシナリオでは、グローバル パラメーターとローカル パラメーターの両方を渡すことで、実行されるコードの動作を特定の要件に合わせて調整でき、Python での動的実行の多用途性を示します。
Python3
アメリカ合衆国には都市がいくつありますか
from> math> import> *> exec> (> 'print(dir())'> , {> 'built'> : __builtins__}, {> 'sum'> :> sum> ,> 'iter'> :> iter> })> |
>
>出力
['iter', 'sum']>
Python での動的実行により、次のような特定のメソッドを実行できます。sum()>
そしてiter()>
内部の組み込みメソッドとともに、exec()>
関数を使用して、Python での動的実行の柔軟性を示します。これにより、すべての組み込みメソッドとともに sum メソッドと iter メソッドのみが exec() 関数内で実行できるようになります。次のように __builtins__ の使用を制限することもできます。
Python3
#__builtins__ has been restricted using None> from> math> import> *> exec> (> 'print(dir())'> , {> '__builtins__'> :> None> }, {> 'sum'> :> sum> ,> 'print'> :> print> ,> 'dir'> :> dir> })> |
>
>出力
['dir', 'print', 'sum']>