Pourquoi est-Python eval (), qui a rejeté cette multiligne chaîne, et comment puis-je résoudre ce problème?
J'essaie d'eval l'onglet suivant en retrait de la chaîne:
'''for index in range(10):
os.system("echo " + str(index) + "")
'''
- Je, "Il y a une erreur: syntaxe invalide , ligne 1"
Qu'est ce qu'il se plaindre? Ai-je besoin de tiret pour correspondre à la fonction eval (), ou écrire à une chaîne de fichier ou les fichiers temp et les exécuter, ou quelque chose d'autre?
Merci,
OriginalL'auteur JonathanHayward | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
eval
évalue des trucs comme5+3
exec
exécute des trucs commefor ...
lol j'ai oublié tout cela 😛
J'ai attrapé ce à partir d'ici stackoverflow.com/questions/30671563/... 😀
OriginalL'auteur Joran Beasley
À utiliser de telles déclarations avec
eval
vous devez les convertir en code objet en premier lieu, à l'aide decompile()
:OriginalL'auteur Ashwini Chaudhary
Nous évaluons (
eval
), des expressions, et de l'exécuter (exec
) consolidés.Voir: Expression Versus Déclaration.
OriginalL'auteur Andy Hayden
(Voir par défaut avertissement de sécurité à la fin avant de vous mettre le code comme celui-ci dans de production!)
Autres réponses font un bon travail en expliquant la différence entre
exec
eteval
.Néanmoins, j'ai eu envie de prendre une entrée comme
x=1; y=2; x+y
plutôt que de forcer les gens à écrire:De manipulation de chaîne de code pour créer ce genre de fonction est une entreprise risquée.
J'ai fini par utiliser l'approche suivante:
Cette analyse de code python; utilise l'ast de la bibliothèque à la reconstruction d'un ast de tout en dehors de la dernière ligne; et la dernière ligne, execing l'ancien et eval qui pratiquent le plus tard.
Avertissement de sécurité
C'est le passage obligatoire de sécurité avertissement que vous devez joindre à
eval
.Eval
ing etexec
'ing code qui est fourni par un utilisateur non privilégié est bien sûr d'insécurité. Dans ces cas, vous préférerez peut-être utiliser une autre approche, ou envisager d'ast.literal_eval.eval
et etexec
ont tendance à être de mauvaises idées, sauf si vous voulez vraiment donner à votre utilisateur de la totalité de la puissance expressive de python.OriginalL'auteur Att Righ