Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのexec()


Exec関数はPythonプログラムのコードを動的に実行できます。コードは、文字列またはオブジェクトコードとしてこの関数に渡すことができます。オブジェクトコードは、文字列が最初に解析され、構文エラーがないかチェックされている間、そのまま実行されます。構文エラーがない場合、解析された文字列はpythonステートメントとして実行されます。

exec()関数の構文

exec(object, globals, locals)

どこ

  • オブジェクト −メソッドに渡される文字列またはコードオブジェクト。

  • グローバル −利用可能なグローバルメソッドと変数の辞書。

  • 地元の人 −利用可能なローカルメソッドと変数の辞書。

文字列の受け渡し

次の例では、1行のコードを文字列としてexec()関数に渡します。 Itrは解析されて実行され、出力が得られます。

x = 9
exec ('print(5*x)')

出力

上記のコードを実行すると、次の結果が得られます-

45

コードオブジェクトの受け渡し

ここで、複数のコードステートメントを使用してコードのブロックを渡す方法を説明します。コードオブジェクトであるため、直接実行されて結果が得られます。 \ nとスペースを使用して、適切なインデントを使用してPythonコードブロックを作成したことに注意してください。

prog_block = 'x = 3 \nif(x < 5): \n print x*x'
exec(prog_block)

出力

上記のコードを実行すると、次の結果が得られます-

9

グローバルパラメータとローカルパラメータなし

グローバルパラメータとローカルパラメータの値を渡さない場合、プログラムにインポートされたパッケージに従って、デフォルトで使用可能な関数を取得します。次の例では、グローバルパラメータ値とローカルパラメータ値の両方がスキップされたときに使用可能なすべての関数を提供するコードを示しています。

from time import *
exec("print(dir())")

上記のコードを実行すると、次の結果が得られます-

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', 
'__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15',
 '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 
'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 
'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 
'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 
'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 
'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']

グローバルパラメータを使用した制限の適用

空のディクショナリをグローバルパラメータとして渡すことにより、インポートされたモジュールの任意の関数へのアクセスを制限できます。この場合、結果には組み込み関数のみが表示され、インポートされたモジュールの関数は表示されません。これが、機能を制限してより安全にする方法です。

from time import *
exec("print(dir())",{})

出力

上記のコードを実行すると、次の結果が得られます-

['__builtins__']

選択した機能のみを許可する

次に、インポートされたモジュールからexec()メソッドに特定の選択された関数のみを適用する方法を確認します。以下の例では、グローバルオプションを使用して、必要な関数のみをパラメーターとして許可しています。 localtime()関数は、プログラムにインポートされるタイムモジュールの一部です。例

from time import *
exec("print lclt()",{"lclt":localtime})

出力

上記のコードを実行すると、次の結果が得られます-

time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)

ローカルパラメータの受け渡し

ローカルパラメータを使用し、組み込み関数を完全に除外することで、インポートされたモジュールからのさまざまな関数の使用を制限することもできます。以下の例では、組み込みのグローバルパラメータの値として[なし]を選択しています。

from time import *
exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})

上記のコードを実行すると、次の結果が得られます-

['dir', 'gtime', 'print']

  1. Pythonコードの最適化のヒント?

    Pythonは他の準拠言語ほど高速でも効率的でもないことは誰もが知っていますが、ただし、Pythonコードがはるかに大きなワークロードを処理できることを示している大企業はたくさんあり、それほど遅くはないことを示しています。このセクションでは、正しいPythonプログラムをさらに高速かつ効率的に実行するために、覚えておくべきヒントをいくつか紹介します。 ヒント1:組み込み関数を使用する Pythonで効率的なコードを書くことはできますが、組み込み関数(Cで書かれている)に勝るものはありません。下の画像は、Python組み込み関数のリストを示しています ヒント2:Pythonの複数の代入を

  2. 修正:インデントエラーPython

    Pythonは、1991年に最初にリリースされた新しいプログラミング言語です。この言語は、その大規模な包括的なライブラリで知られており、機能、必須、手続き型、オブジェクト指向などのいくつかのプログラミングパラダイムをサポートしています。 「インデントエラー:インデントされたブロックが必要です ’はあらゆる種類のユーザーに発生します。彼らが初心者であろうと経験者であろうと。 Pythonはすべてのコードを正しい空白で配置するため、インデントが不適切な場合、コードはコンパイルされず、エラーメッセージが返されます。 PEP8で従う規則によれば、必要に応じて4つの空白が必要です。すべてのプログラ