1

変数タイプ、変数名、プロンプト、およびデフォルト値のリストを渡すことができるクラスを作成しました。このクラスはwxPythonパネルを作成します。このパネルはフレームに表示され、ユーザーが計算ボタンを押して結果をプロットとして返す前に入力値を設定できます。execステートメントを使用してすべての変数をクラスに追加します。これにより、すべての変数が1つのクラスにまとめられ、名前で参照できます。

light = Variables( frame , [ ['f','wavelength','Wavelength (nm)',632.8] ,\
                             ['f','n','Index of Refraction',1.0],])

クラス内で、次のようなステートメントを使用して変数を作成および設定します。

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :  
           exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )

変数を使用する必要がある場合は、名前で参照できます。

 wl = light.wavelength
 n = light.n

次に、Pythonでexecを使用する必要はめったにないことをSOで読みました。このアプローチに問題はありますか?グループ化する必要があり、編集できるようにしたい変数を保持し、表示、編集(およびすべての変数をファイルに保存)するためのコードとwxPython呼び出しを含むクラスを作成するためのより良い方法はありますか?またはそれらをもう一度読み返します)?

Curt

4

4 に答える 4

18

この関数を使用できます。このsetattr関数は、オブジェクト、属性の名前、およびその値の3つの引数を取ります。例えば、

setattr(self, 'wavelength', wavelength_val)

と同等です:

self.wavelength = wavelength_val

したがって、次のようなことができます。

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :
           setattr(self, var_name, var_text_ctrl.GetValue())
于 2009-07-17T17:40:40.333 に答える
1

mipadiの回答に同意しますが、元の投稿でexecの使用に問題があるかどうかを尋ねられたため、もう1つ回答を追加したいと思います。それに対処したいと思います。

犯罪者のように考えてください。

悪意のある敵があなたが次のようなコードを持っていることを知っていた場合:

exec('self。'+ var_name +'=' + var_text_ctrl.GetValue())

次に、コードをハッキングするvar_nameとvar_text_ctrlの値を挿入しようとする場合があります。

悪意のあるユーザーがvar_nameを次の値にする可能性があると想像してみてください。

var_name = "" "
a = 1#「自己」を完成させるための偽の割り当て。声明
import os#悪意のあるコードはここから始まります
os.rmdir('/ bin')#悪を行う
                      #別のvar_nameで終了します
                      #(「a」のみ、次の行)
a     
"" "

突然、悪意のある攻撃者は、あなたにコードを実行させて/ binディレクトリ(または彼らが望むあらゆる悪)を削除させることができました。これで、execステートメントは大まかに次と同等のものを読み取ります。

exec( "self.a = 1 \ n import os \ n os.rmdir('/ bin')\ n \ n"
             "a" +'=' + var_text_ctrl.GetValue())

良くない!!!

ご想像のとおり、execを使用すると、あらゆる種類の悪意のあるコードインジェクションを構築する可能性があります。これは、コードがハッキングされる可能性のある方法を考えるために開発者に負担をかけます-そして、リスクのない代替手段が利用可能である場合、不必要なリスクを追加します。

于 2009-07-20T20:17:39.553 に答える
0

セキュリティを意識している場合は、許容できる代替手段があるかもしれません。以前は、任意のPythonコードの「制限された」実行を可能にするモジュール呼び出しrexecがありました。このモジュールは、最近のPythonバージョンから削除されました。http://pypi.python.org/pypi/RestrictedPythonは、任意のPythonコード用の「制限付き」環境を作成するZopeの人々による別の実装です。

于 2009-07-28T01:01:47.403 に答える
0

モジュールにはセキュリティ上の問題があったため、削除されました。Pythonが持つすべての内省により、制限された環境で任意のコードを実行できる環境を提供することは非常に困難です。

より良い方法は、evalとexecを避けることです。

本当に壁から外れたアイデアは、Google App Engineを使用して、悪意のあるコードについて心配させることです。

于 2009-07-28T20:21:24.877 に答える