Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

eval et exec

+6 votes

Je lis qu'eval() peut être dangereux car il expose les éléments "privés" des objets (exemple ici), et j'ai donc appris à ne pas l'utiliser. Qu'en est-il d'exec()? est-ce qu'on "a le droit" de l'utiliser ou mieux vaut-il l'éviter lui aussi?
Là tout de suite je me tape des objets dont les noms des attributs sont contenus dans une liste d'entrée et qu'il faut ensuite initialiser, et je ne vois pas comment faire autrement qu'avec exec() si je veux pouvoir faire ça à la volée:

in_attr = ['input1','input2']
in_val = [2,5]
for idx,attr in enumerate(in_attr):
    exec('my_obj.inputs.' + attr + ' = ' + str(in_val[idx]))
demandé 1-Avr-2015 par furankun (1,434 points)

Le 'danger' de exec/eval vient quand on exécute du code non 'controlé' (ce qui ce passe dans l'exemple de ton lien à cause du raw_imput()). Un autre lien intéressant sur le sujet.

Dans ton exemple, si le contenu de in_attr et in_val est connue et sûr, ce qui semble le cas, il n'y a pas vraiment de risque.
C'est juste que setattr() existe déjà en standard exactement pour cette situation.

1 Réponse

+7 votes
 
Meilleure réponse

va voir du côté de setattr et getattr

par exemple:

in_attr = ['input1','input2']
in_val = [2,5]
for idx,attr in enumerate(in_attr):
    setattr(my_obj.inputs, attr , in_val[idx])
répondu 1-Avr-2015 par bubulle (2,256 points)
sélectionné 1-Avr-2015 par furankun

Ca marche impec! si je comprends bien, je range exec() avec eval() au fond du placard?

Il y a un poste intéréssant sur se sujet, notamment sur les cas d'utilisation d'exec() eval() ou setattr().
http://stackoverflow.com/questions/7782233/python-how-to-create-private-class-variables-using-setattr-or-exec
Jetes-y un coup d'oeil x)

oui, exec/eval sont inutiles ici. Personnellement, je n'ai eu à les utiliser qu'une fois quand j'ai voulu créer des fonctions à la volée et que les closures ne suffisaient pas.

...