2017-10-09 7 views
0

以下の例の 'eval'をより良い関数に置き換えたいと思います。研究の結果、これは良い考えではないことが私の理解になっています。より良いeval関数の置換

class_name = '{}'.format(SIP.supported_classes_dictionary[msg_type]) 
print 'Testing {}'.format(eval(class_name).supported_sip_services[msg_type]) 
variable_array = eval(class_name).fields_desc[2:] 

答えて

0

あなたが達成しようとしていることは、クラス辞書が(信頼できない)ユーザー入力でない限り、おそらく最悪の選択ではないでしょう。

コードを改善するために、辞書を制御するときにも、クラス名の代わりにクラスを辞書の中に入れることを検討してください。これは問題をよりエレガントに解決します。

class A: 
    pass 
class B: 
    pass 
myclasses = [A, B] 
for cls in myclasses: 
    print cls.__name__ 

よう

何かが可能であり、文字列やPythonオブジェクト/クラス間の変換を回避します。

+0

軽度の疑問: 'os'と' sys'はクラスではなく、モジュールです。もちろん、クラスでもうまくいくでしょう。 – jacg

+0

Opps、確かに。他に何かを念頭に置いていた。私は答えを変えます。 – allo

0

クラスの名前ではなく、クラス自体を辞書の値として保存できます。その後、私はちょうどchosen_classであなたのeval(class_name)を交換した最後の2行で

chosen_class = SIP.supported_classes_dictionary[msg_type] 
print 'Testing {}'.format(chosen_class.supported_sip_services[msg_type]) 
variable_arry = chosen_class.fields_desc[2:] 

を行うことができるようになります。 (これは単なる化粧品の詳細である)class_namechosen_classへの最初の行に変数名を変更する

  1. クラスではなく、文字列と
  2. Populanting SIP.supported_classes_dictionary:これは2つのことによって可能になります。あなたのコードサンプルでこれをどのように行うかを示していないので、正確な変更を表示することはできませんが、d[some_message_type] = 'SomeClass'からd[some_message_type] = SomeClassに変更する行に沿ったものかもしれません。つまり、クラスの引用符を削除してくださいあなたがそれを辞書に貼り付けるとき、名前。
関連する問題