2017-10-09 14 views
0

Je veux remplacer 'eval' dans l'exemple ci-dessous avec une meilleure fonction. À la suite des recherches, j'ai compris que l'utilisation de ce n'est pas une bonne idée.Remplacements pour la fonction eval avec un meilleur

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:] 

Répondre

0

Pour ce que vous essayez d'atteindre, il est sans doute pas le plus mauvais choix, aussi longtemps que le dictionnaire classes est pas (non sécurisé) entrée utilisateur.

Pour améliorer le code, lorsque vous contrôlez également le dictionnaire, pensez à placer les classes dans le dictionnaire au lieu des noms de classe. Cela résoudrait le problème plus élégant.

Quelque chose comme

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

est possible et évite la conversion entre les chaînes et les objets python/classes.

+0

Petite puce: 'os' et' sys' ne sont pas des classes, ce sont des modules. Cela fonctionnerait aussi avec les classes, bien sûr. – jacg

+0

Opps, en effet. Avait quelque chose d'autre à l'esprit. Je change la réponse. – allo

0

Vous pouvez stocker les classes elles-mêmes, plutôt que leurs noms, en tant que valeurs dans votre dictionnaire. Ensuite, vous pourrez faire

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:] 

Sur les deux dernières lignes, je l'ai remplacé votre eval(class_name) avec juste chosen_class. Ceci est rendu possible par deux choses:

  1. Changer le nom de la variable sur la première ligne class_name-chosen_class (ce qui est un détail cosmétique)
  2. Populanting SIP.supported_classes_dictionary avec des classes plutôt que des chaînes. Comme vous n'avez pas montré comment vous faites cela dans votre exemple de code, je ne peux pas vous montrer le changement exact que vous avez à faire, mais cela peut être quelque chose comme changer d[some_message_type] = 'SomeClass' à d[some_message_type] = SomeClass par exemple, supprimer les guillemets autour de votre classe nom, lorsque vous le collez dans le dictionnaire.