1

私はいつもどの言語でも eval を使うことにうんざりしていますが、2 つのことを行うためのより良い方法は思いつきません。私が読んだすべてのことから、evAlは悪です(それは悪かったです)。どんな考えでも大歓迎です。別のモジュールからの呼び出し方法に応じて、関数を呼び出すか、属性を設定する辞書を持つモジュールがあります

module Config
some_dict = {1: ["desc 1", "callfunction1()"], 
  2: ["desc2", "setattr(object, "attribute", "the fun things"]} 

module other
try:
  i = int(input())
  eval(Config.some_dict[i][1])
except ValueError:
  print("nope")

これを行うためのより安全な方法があるかどうか疑問に思っています。
また、プログラムの実行中にデバッグしようとしている場合:

try:
  eval(input())
except:
  pass

これは受け入れられるものですか、それともpythonicですか、それとももっと良い方法がありますか? 私はPythonが初めてです(私は主にJSLを実行しているので、すべてがeval(parse())で行われます)。

4

4 に答える 4

3

辞書の値を何らかの呼び出し可能オブジェクトにすることをお勧めします。例えば、

some_dict = {
    1: ["desc 1", callfunction1], 
    2: ["desc2", lambda: setattr(object, "attribute", "the fun things")]
}

次に、辞書の要素を使用する場合は、それらを呼び出すだけです:

name, func = some_dict[1]
func()

重要なことは、ディクショナリ内の各値が同じ呼び出しインターフェイスを持つ必要があることです (たとえば、引数を取りません)。

于 2013-08-09T16:20:02.663 に答える
0

なぜ単純ではないのですか:

some_dict[2]['function'] = setattr
some_dict[2]['options'] = [object, "attribute", "value"]

それで、

if option = 'foo':
   some_dict[2]['function'](*some_dict[2]['options'])
于 2013-08-09T16:19:26.247 に答える