Ce n'Python eval() faire?
Dans le livre que je lis sur le langage Python, il continue d'utiliser le code eval(input('blah'))
J'ai lu la documentation, et je le comprends, mais je ne vois toujours pas comment elle change la input()
fonction.
Que fait-il? Quelqu'un peut m'expliquer?
- C'est qu'un Python 3.x livre ou un 2.x un? De toute façon, une telle utilisation libérale de
eval
suggère que c'est un terrible livre. - Votre livre a l'air terrible. Vous devriez trouver un meilleur livre, peut-être greenteapress.com/thinkpython/html/index.html
- Ce livre était-ce trouve dans?
- Fonction Eval essayez d'exécuter et interpréter la chaîne(argument) est passé comme code python. x=1 print (eval('x+1')) Sortie le code ci-dessus sera de 2. L'inconvénient de cette approche est que ,l'utilisateur d'obtenir l'indépendance de l'écriture de code qui peut entraîner des ravages conditions.Si vous pouvez empêcher les utilisateurs d'accéder à un grand nombre de variables et de méthodes en passant globale et locale de paramètre dans la fonction eval.
Vous devez vous connecter pour publier un commentaire.
La fonction eval permet à un programme en Python exécuter du code Python à l'intérieur de lui-même.
eval exemple (shell interactif):
eval()
peut également être utilisé pour exécuter hautement dynamique de code, mais vous devez être pleinement conscient de la sécurité et de la performance des risques avant de l'utiliser.eval
, ni qu'il pouvait faire ce qu'il fait aveceval
.eval
, autres que l'insécurité, ne peut pas exécuter l'ensemble des programmes comme codepad n'car il ne peut évaluer une expression unique.eval()
interprète une chaîne de caractères sous forme de code. La raison pour laquelle tant de nombreuses personnes ont mis en garde sur l'utilisation de ce est parce que l'utilisateur peut utiliser cette option pour exécuter du code sur l'ordinateur. Si vous avezeval(input())
etos
importés, une personne pourrait être eninput()
os.system('rm -R *')
qui seraient supprimer tous les fichiers dans votre répertoire home. (En supposant que vous avez un système unix). À l'aide deeval()
est un trou de sécurité. Si vous avez besoin de convertir des chaînes en d'autres formats, essayez d'utiliser des choses qui font que, commeint()
.eval
avecinput()
est un trou de sécurité. Ne mettez pasinput()
à l'intérieur d'un eval déclaration et vous serez amende.eval
est un problème de sécurité dans de nombreux cas.input
prend habituellement ses données à partir de la console, l'utilisateur peut simplement quitter le programme et le typerm -R *
de toute façon...Beaucoup de bonnes réponses ici, mais aucun décrire l'utilisation de
eval()
dans le cadre de songlobals
etlocals
kwargs, c'est à direeval(expression, globals=None, locals=None)
(voir les docs poureval
ici).Ceux-ci peuvent être utilisés pour limiter les méthodes qui sont disponibles par le biais de la
eval
méthode. Par exemple, si vous chargez une nouvelle interpréteur python lelocals()
etglobals()
sera la même et ressemble à quelque chose comme ceci:Il ya certainement des méthodes au sein de la
builtins
module qui permet de faire beaucoup de dommages à un système. Mais il est possible de bloquer quoi que ce soit et tout ce que nous ne voulons pas disponible. Prenons un exemple. Disons que nous voulons construire une liste de représenter un domaine de cœurs disponibles sur un système. Pour moi, j'ai 8 cores, donc je voudrais une liste[1, 8]
.De même tous
__builtins__
est disponible.Ok. Donc là, nous voyons une méthode que nous voulons exposée et un exemple de l'un des (nombreux qui peuvent être beaucoup plus complexes) méthode que nous ne voulons pas exposés. Donc permet de bloquer tout.
Nous avons effectivement bloqué tous les
__builtins__
méthodes et en tant que tel a apporté un niveau de protection dans notre système. À ce point, nous pouvons commencer à ajouter dans les méthodes que nous voulons exposés.Maintenant, nous avons le
cpu_count
méthode tout en continuant de bloquer tout ce que nous ne voulons pas. À mon avis, c'est super puissant et clairement du champ d'application des autres réponses, pas une mise en œuvre commune. Il existe de nombreuses utilisations pour quelque chose comme ça, et tant qu'il est manipulé correctement personnellement, je pense queeval
peut être utilisé en toute sécurité à une grande valeur.N. B.
Quelque chose d'autre qui est cool à propos de ces
kwargs
est que vous pouvez commencer à utiliser le raccourci de votre code. Disons que vous utiliser la fonction eval dans le cadre d'un pipeline pour exécuter un texte importé. Le texte n'a pas besoin d'avoir le code exact, il peut suivre certains modèle de format de fichier, et encore exécuter tout ce que vous voulez. Par exemple:En Python 2.x
input(...)
est équivalent àeval(raw_input(...))
, en Python 3.xraw_input
a été renomméinput
, dont je soupçonne conduire à votre confusion (vous avez probablement été à la recherche à la documentation deinput
en Python 2.x). En outre,eval(input(...))
marcherait bien en Python 3.x, mais poserait unTypeError
en Python 2.Dans ce cas
eval
est utilisé afin de le contraindre à la chaîne renvoyée parinput
dans une expression et d'interpréter. En général, il est considéré comme une mauvaise pratique.input
signifie queraw_input
n'a en 2.x.eval()
évalue la chaîne passée comme une expression Python et retourne le résultat. Par exemple,eval("1 + 1")
interprète et exécute l'expression"1 + 1"
et renvoie le résultat (2).Une raison quelconque, vous pourriez être confus est parce que le code que vous avez cité implique un niveau d'indirection. L'intérieur de la fonction d'appel (entrée) est exécutée en premier, de sorte que l'utilisateur voit la "blah" invite de commandes. Imaginons ils répondent avec "1 + 1" (les guillemets ajoutés pour plus de clarté, ne tapez pas lors de l'exécution de votre programme), l'entrée de la fonction retourne cette chaîne, qui est ensuite transmis à la fonction externe (eval) qui interprète la chaîne et renvoie le résultat (2).
Lire plus sur eval ici.
Peut-être un exemple trompeur de la lecture d'une ligne et de l'interpréter.
Essayer
eval(input())
et le type"1+1"
- ce doit imprimer2
. Eval évalue les expressions.eval()
, comme son nom l'indique, évalue l'argument passé.raw_input()
est maintenantinput()
en python 3.x versions. Si l'on trouve le plus couramment exemple pour l'utilisation deeval()
est son utilisation pour fournir la fonctionnalitéinput()
fourni en 2.x version de python.raw_input retourné les données saisies par l'utilisateur comme une chaîne de caractères, alors que l'entrée a évalué la valeur de la saisie des données et l'a retourné.
eval(input("bla bla"))
donc reproduit la fonctionnalité deinput()
en 2.x, c'est à dire, d'en évaluer les données saisies par l'utilisateur.En bref:
eval()
évalue les arguments passés à elle et donceval('1 + 1')
renvoyé 2.L'une des applications utiles de
eval()
est d'évaluer des expressions python de chaîne. Par exemple, charger à partir du fichier représentation de chaîne de dictionnaire:Lit comme une variable et de l'éditer:
De sortie:
eval
n'?Je suis en retard pour répondre à cette question, mais personne ne semble donner de réponse claire à la question.
Si un utilisateur entre une valeur numérique,
input()
renverra une chaîne.Donc,
eval()
permettra d'évaluer la valeur de retour (ou l'expression) qui est une chaîne de retour entier/flottant.De cource c'est une mauvaise pratique.
int()
oufloat()
doit être utilisé au lieu deeval()
dans ce cas.Une autre option si vous souhaitez limiter l'évaluation de la chaîne de littéraux simples est d'utiliser
ast.literal_eval()
. Quelques exemples:De la docs:
Que pourquoi il est si limitée, à partir de la liste de diffusion:
ast.literal_eval
ne prend pas en charge les opérateurs, contrairement à votre'1+1'
exemple. Néanmoins, il prend en charge les listes, des nombres, des chaînes, etc, et est donc une bonne alternative pour les communeseval
cas d'utilisation.