9
votes

Comment définir une fonction d'une chaîne à l'aide de Python

Ceci est mon code: xxx

mais il affiche l'erreur: xxx

alors que puis-je faire, < p> merci


1 commentaires

Pourquoi avez-vous besoin d'eval ()?


4 Réponses :


16
votes

eval () avec un argument de chaîne est uniquement destiné aux expressions. Si vous souhaitez exécuter des instructions, utilisez exec : xxx

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.


5 commentaires

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


@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] , si vous ne connaissiez pas le nom amusant à l'avance


eval n'est pas uniquement pour les expressions; C'est juste que STR 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 , Vous pouvez eval code arbitraire, par exemple eval (compile (mystr, '', 'exec')) fonctionne bien (et fonctionne de manière identique sur Python 2 et Python 3, contrairement à exécuté ).


«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.



3
votes

eval évalue uniquement les expressions, tandis qu'EX exécute des déclarations.

Vous essayez donc quelque chose comme celui-ci xxx


0 commentaires

1
votes

Si votre logique est très simple (c'est-à-dire une ligne), vous pouvez évaluer un lambda expression: xxx

Comme d'autres personnes ont mentionné, c'est probablement meilleur pour éviter eval si vous le pouvez.


0 commentaires

2
votes

non expression eval Les arguments doivent être compile -ed premier ; Un STR est uniquement traité comme une expression, de sorte que des instructions complètes et un code arbitraire nécessitent compiler .

Si vous le mélangez avec compile , vous pouvez eval code arbitraire, par exemple: xxx

Le ci-dessus fonctionne bien et fonctionne de manière identique sur Python 2 et Python 3, Contrairement à EXEC (qui est un mot-clé dans PY2 et une fonction dans Py3).


2 commentaires

Faire cela dans Python 3.7 renvoie Aucun et non l'objet de la fonction.


@Jonno_ftw: Ce n'est pas censé le renvoyer ( def 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 s pour les globaux ou les locaux). eval est attendu que de produire une valeur de retour utile lorsqu'il est utilisé avec des chaînes ou avec compiler dans 'eval' mode; Dans 'Single' ' ou ' Exec ' mode, il n'évaluait pas les expressions.