Ceci est mon code: mais il affiche l'erreur: p> alors que puis-je faire, P> < p> merci p> p>
4 Réponses :
mais avant de le faire, pensez si vous avez vraiment besoin de code dynamique ou non. De loin, la plupart des choses peuvent être faites sans. P> p> eval () code> avec un argument de chaîne est uniquement destiné aux expressions. Si vous souhaitez exécuter des instructions, utilisez exec code>:
Dans Python3, c'est maintenant une fonction. Vous devrez peut-être passer dans un faux dictionnaire local / global, effectuer la mission à une valeur magique connue et faire amusement = myfakelocals ['magic_value'] code>
@ninjagecko: Son code utilisait la syntaxe Python 2, donc j'ai supposé qu'il aimerait sa réponse dans le même dialecte. C'est trivial pour "port" à Python 3, il suffit d'ajouter des parenthèses. Pas besoin de passer dans les locaux / globaux non plus.
Oups, en effet, vous êtes tout à fait correct; Je l'ai confus avec une méthode alternative pour locaux () [communique] code>, si vous ne connaissiez pas le nom amusant code> à l'avance
eval code> n'est pas uniquement pour les expressions; C'est juste que STR code> Les arguments doivent être des expressions, mais cela peut également prendre des objets de code de complexité arbitraire. Si vous le mélangez avec compile code> , Vous pouvez eval code> code arbitraire, par exemple eval (compile (mystr, ' exécuté code>).
«Mais avant de faire cela, pensez si vous avez vraiment besoin de code dynamique ou non. De loin, la plupart des choses peuvent être faites sans.», Oui, sinon j'écrirais Vbscript. "De loin, la plupart des choses peuvent être faites sans.", Et serait mieux faite avec d'être plus parallélélisable (si c avait intégré le précompiler de coquille à coquillée, les threads seraient beaucoup plus pratiques à écrire sans avoir recours à une langue supérieure ou Faire une fonction globale pour chaque processus de thread) et ne pas encombrer la portée mondiale avec des trucs uniquement utilisés une fois.
eval évalue uniquement les expressions, tandis qu'EX exécute des déclarations.
Vous essayez donc quelque chose comme celui-ci p>
Si votre logique est très simple (c'est-à-dire une ligne), vous pouvez évaluer un Comme d'autres personnes ont mentionné, c'est probablement lambda code> expression: eval code> si vous le pouvez. P> P>
non expression Si vous le mélangez avec Le ci-dessus fonctionne bien et fonctionne de manière identique sur Python 2 et Python 3, Contrairement à eval code> Les arguments doivent être compile code> -ed premier ; Un STR code> est uniquement traité comme une expression, de sorte que des instructions complètes et un code arbitraire nécessitent compiler code>. compile code> , vous pouvez eval code> code arbitraire, par exemple: p> EXEC code> (qui est un mot-clé dans PY2 et une fonction dans Py3). P> p>
Faire cela dans Python 3.7 renvoie Aucun code> et non l'objet de la fonction.
@Jonno_ftw: Ce n'est pas censé le renvoyer ( def code> n'est pas une expression, il ne produit rien d'assignable), il l'ajoute simplement à la portée actuelle (locale si dans une fonction, autrement, autrement, Et vous pouvez éventuellement passer d'autres dict code> s pour les globaux ou les locaux). eval code> est attendu que de produire une valeur de retour utile lorsqu'il est utilisé avec des chaînes ou avec compiler code> dans 'eval' code> mode; Dans 'Single' ' code> ou ' Exec ' code> mode, il n'évaluait pas les expressions.
Pourquoi avez-vous besoin d'eval ()?