2

eval() と exec() を避けるべきであることはわかっていますが、この状況ではそれが最良の選択のように思えます: wxPython のチェックボックスとテキストボックスから値を取得し、それらを構成クラスに入れています。eval() の使用方法は次のとおりです。

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(eval('self.m_checkBox_'+key+'.GetValue()'))

eval へのユーザー入力がないため、セキュリティ上の問題はありません。これは私には明らかです。これを行うより良い方法はありますか?

4

5 に答える 5

6

どうですか:

config = wx.Config()
checkBoxes = {'option_1': m_checkBox_option_1, 
              'option_2': m_checkBox_option_2}
for checkbox in checkBoxes:
    config.Write(checkbox, str(checkBoxes[checkbox].Value()))
于 2012-08-01T21:53:54.317 に答える
5
config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(getattr(self, 'm_checkBox_'+key).Value()))
于 2012-08-01T22:03:33.350 に答える
5

他の回答は、当面の問題に対する代替解決策を提案する良い仕事をしているので、あなたが尋ねたより大きな質問を見て、evalの問題について詳しく書いた賢い開発者の言葉にあなたを導きます.


を見るevalと、周囲のコードに暗雲が立ち込め、その使用が正当であると納得するまで、疑念と不信感を持って全体の混乱に目を向けます。

[...]

evalというのは悪い考えです。なぜなら、それが使用されているのを見るたびに、予期せぬ不必要な問題を引き起こしてきたからです。

重要なビットは、「予期せぬ」と「不必要」です。それに関連する警告が膨大に山積みevalされているため、予期せぬことであり、考えずにはリスト全体を思い出すことさえできません. 代替手段は実装するのにそれほど多くの作業を必要としない傾向があるため、不必要です。一方、によって引き起こされる問題は微妙で悪質です。evaleval

[...]

eval微妙なセキュリティと変換の問題がたくさん発生し、バイトコードのキャッシングが無効になり、実行時まで構文やその他のエラーが隠され、追跡が困難な距離でアクションが発生し、構文の強調表示が無効になるため、これは良くありません。コードを悪化させるだけです。


eval()ユーザー入力にさらされないようにしたと言います。すごい!それは良い第一歩ですが、引用が言及しているように、それはあなたが考えなければならないことのリストの終わりではありませんeval(). この答えとあなたがまとめた他の答えをもたらしたのは、それeval()偽りの経済であるということです。少なくとも、技術的負債の発生です。eval()最適化と同様に、「使用すべきか?」に対する 2 つの答えです。「すべきではない」と「まだすべきではない」です。

于 2012-08-01T22:04:56.180 に答える
-1

通常はもっと良い書き方があります。この場合locals()は ですが、そもそも名前や複数の変数ではなく、チェックボックス オブジェクトのリストが必要になる場合があります。

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(locals()['m_checkBox_' + key].Value()))
于 2012-08-01T21:53:31.550 に答える
-1
config.Write(key, str(locals()['m_checkBox_%s' % key].Value()))

locals()ローカル、globals()グローバル、getattr(obj, attr_name)attr_name で obj の属性を取得するために使用します。

于 2012-08-01T21:56:23.380 に答える