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

Python eval()


eval()メソッドは、このメソッドに渡された式を解析し、プログラム内で式を実行します。つまり、文字列をPythonプログラム内のコードとして解釈します。

構文

evalの構文は次のとおりです-

eval(expression, globals=None, locals=None)

どこ

  • 表現 −メソッドに渡されるPython式です。

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

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

以下の例では、ユーザーが式をセレートし、Pythonプログラムを実行してその式を評価できるようにします。したがって、動的コードの作成に役立ちます。

# expression to be evaluated
user_expr = raw_input("Enter an expression in terms of variable a):")
#nter the value of variable
a = int(raw_input("Enter the value of a:"))
# evaluate the expression
result = eval(user_expr)
# printing evaluated result
print("Result = {}".format(result))

出力

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

Enter an expression in terms of variable a):a*(a-3)+a^2
Enter the value of a:7
Result = 33

eval()のセキュリティ問題

Webアプリケーションまたはデスクトッププログラムを含むプログラムの場合、プログラムを実行する使用により、ファイルを削除したり、システムから機密データを取得したりするシステムコマンドである式が提供される可能性があるため、このようなeval()メソッドを使用するとセキュリティの脆弱性が生じる可能性があります。これを防ぐためのステップとして、eval()関数をいくつかの選択された関数または変数に制限することができます。

これらの脆弱性を防ぐための手順は次のとおりです-

eval()メソッドでローカル変数とグローバル変数の両方を省略します。

このようにして、現在のスコープでのみ評価され、このスコープ外の他の変数は検出されません。

ローカルパラメータのみを省略

ローカル変数を省略すると、すべての変数がグローバル変数としてスコープされます。次に、空の辞書をグローバル変数として渡します。これにより、他のライブラリをプログラムにインポートした場合でも、組み込み変数のみを使用できるようになります。

from time import *
print(eval('dir()', {}))
<出力>

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

['__builtins__']

次に、インポートされたライブラリの特定のメソッドのみをプログラムで使用できるようにすることもできます。

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

出力

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

['Localtime', '__builtins__', 'sleeptime']

グローバルとローカルの両方に選択機能を渡す

また、組み込みのライブラリを許可せず、ローカルにインポートされたライブラリからいくつかのみを許可することで、ローカルスコープとグローバルスコープの両方で関数の可用性を制限できます。以下の例では、タイムライブラリからgmtimeメソッドのみを使用できるようにしています。

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

出力

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

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)

  1. Pythonで位置座標をタプルに変換する

    位置座標をタプル形式に変換する必要がある場合は、「eval」メソッドを使用できます。 evalメソッドは、引数として渡された式を解析します。その引数をコードとして実行します。 式、つまりパラメータから評価された結果を返します。 以下は同じのデモンストレーションです- 例 my_string = "67.5378, -78.8523" print("The string is : ") print(my_string) my_result = eval(my_string) print("The coordinates after co

  2. 特定の式の式ツリーを構築するPythonプログラム

    式ツリーは、リーフノードが操作される値を持ち、内部ノードがリーフノードが実行される演算子を含むツリーです。 例:4 +((7 + 9)* 2) -のような式ツリーがあります この問題を解決するためのアプローチ 特定の式の式ツリーを構築するために、通常、スタックデータ構造を使用します。最初に、指定された接尾辞式を繰り返し処理し、以下の手順に従います- 指定された式でオペランドを取得した場合は、それをスタックにプッシュします。これは、式ツリーのルートになります。 演算子が式で2つの値を取得した場合は、式ツリーにその子として追加し、それらを現在のノードにプッシュします。 指定された式が完