紙はZhongjueはこの練習が不可欠です知って来ます。------呂の歌「冬の読書ショーサブゆう」
ダイナミックな走行Pythonコード
I.はじめに
実際には、我々は柔軟性を確保するために、我々はコードを動的に生成して実行する必要があるので、今日は単にPythonはPythonのコードを実行使用して要約し、そのプログラムの実装の実際のニーズを知りません。
第二に、事前知識ポイント
動的にPythonスクリプトを実行しようとすると、あなたは、Pythonにどのように文字列またはファイルの内容を知っていると命令を特定する必要があります。実装コードを動的評価()とexec()関数を使用することができ、ロードされて実行します。
2.1.eval()関数
eval()関数は、文字列式を実行するために使用され、式の値を返しています。構文は次のとおりです。
eval(expression, globals=None, locals=None)
- 表現 - 表現。
- グローバル - 変数のスコープ、グローバル名前空間、提供されている場合、それは辞書オブジェクトでなければなりません。
- 地元の人々 - 変数のスコープは、ローカル名前空間は、提供されている場合、任意のマップのオブジェクトでもよいです。
注:単一の演算式(実行するPythonコードノートevalが割り当ての任意の形式をサポートしていない)ではない複雑なコード・ロジックを、それがラムダ式と全く同様です。
2.2.exec()関数
EXEC()はevalと比較ファイルまたは文字列に格納されているPythonのステートメントを実行し、Execは、より複雑なPythonコードを実行することができます。
exec(object[, globals[, locals]])
- オブジェクト:必要なパラメータPythonコードを指定する必要があることを示して。これは、文字列またはコードオブジェクトでなければなりません。オブジェクトは、(構文エラーが発生しない限り)最初のPythonの文のセットに解決し、次に実行される文字列である場合。オブジェクトは、コードオブジェクトである場合、それは単純な実行です。
- グローバル:オプションのパラメータ(グローバル変数を格納するために)グローバルネームスペースを表し、提供されている場合、辞書オブジェクトでなければなりません。
- 地元の人々は:現在のローカル名前空間を(ローカル変数を格納する)を示すオプションのパラメータは、提供される場合、任意の地図オブジェクトであってもよいです。このパラメータは無視されている場合は、それはグローバルに同じ値をとります。
execの戻り値は常にNoneです。
2.3.eval使用とexecとの違い
- EXEC()関数は、動的コードセグメントを実行することができ、一方のeval()関数は、単一の式を計算値。
- evalの()関数は値を返すことができ、とexec()関数が返す値は常にNoneです。
第三に、ダイナミック詳細なパイソンの実装
次のカテゴリが何であるかダイナミックPythonの簡単なリストを実行するには、いくつかの方法があります。
- Pythonの文の文字列の単一行の実装
- Pythonは、コードの複数行のステートメントブロックを実行します
- 機能を実行します
- 動的実行Pythonのファイル
今、私たちはそれ一つ一つの使用を説明します。
3.1。彼の文字列式を行います
彼の文字列式が行われた場合には、使用のeval()やexec()関数であってもよいが、EXEC()メソッドは結果を返しません。ここで使用する例としては、唯一のeval()メソッドを示します。
def print_str():
eval("print('hello world')")
def add(x, y):
return eval("x+y")
if __name__ == "__main__":
print_str()
print(add(12, 56))
次のように実行結果は以下のとおりです。
3.2。コードのブロック
あなたは複数行の文字列式を実行する場合は、evalの()は、使用の多くではない、のevalは、割り当てのいずれかの形式をサポートしていません。EXEC()メソッドを使用するようにします。
expr = """
count = 10
for index in range(count):
print(index)
"""
def eval_code():
eval(expr)
def exec_for():
exec(expr)
if __name__ == "__main__":
exec_for()
# eval_for() # 这样写会报错
次のようにプレゼンテーション:
3.3。実行機能
実際には、そこには差はなく、他の機能を実行し、評価()とexec()関数を使用することができます
def print_str():
eval("print('hello world')")
def eval_fun():
eval("print_str()")
def exec_fun():
exec("print_str()")
if __name__ == "__main__":
eval_fun()
exec_fun()
結果は以下の通りであります:
3.4。実行の.pyファイル
時々、私たちはその後、実際には、内蔵のPython2でのpythonファイルの実装で達成することができる機能execfileを()があり、使用することができますEXEC()関数を使用し、PYファイルを実行する必要がありますが、のpython3で削除されている方法です。あなただけのexec()のpythonファイルを実行を使用することができます。
def exec_file(file_name, func_name):
with open(file_name, "rb") as f:
source_code = f.read()
exec_code = compile(source_code, file_name, "exec")
scope = {}
exec(exec_code, scope)
f = scope.get(func_name, None)
f()
if __name__ == "__main__":
exec_file(文件名, 方法名)
第四に、実際の
# -*- coding: utf-8 -*-
# 动态执行python
expr = """
count = 10
for index in range(count):
print(index)
"""
def print_str():
eval("print('hello world')")
def add(x, y):
return eval("x+y")
def eval_for():
eval(expr)
def exec_code():
exec("print('hello world')")
def exec_for():
exec(expr)
def eval_fun():
eval("print_str()")
def exec_fun():
exec("print_str()")
def exec_file(file_name, func_name):
with open(file_name, "rb") as f:
source_code = f.read()
exec_code = compile(source_code, file_name, "exec")
scope = {}
exec(exec_code, scope)
f = scope.get(func_name, None)
f()
if __name__ == "__main__":
# print_str()
# print(add(12, 56))
# exec_fun()
# sum = add(12, 45)
# print("sum=", sum)
# exec_for()
# eval_for()
eval_fun()
exec_fun()
# 我测试的使用使用的我的博客的文件名,大家可以去我的博客里面取
# https://blog.csdn.net/m1090760001/article/details/103329077
# exec_file("seleniumblog.py", "open_blog")