Dans le livre que je lis sur Python, il continue d'utiliser le code eval(input('blah'))
J'ai lu la documentation et je la comprends, mais je ne vois toujours pas comment cela change la input()
fonction.
Qu'est ce que ça fait? Quelqu'un peut-il expliquer?
Réponses:
La fonction eval permet à un programme Python d'exécuter du code Python en lui-même.
exemple eval (shell interactif):
la source
eval()
peut également être utilisé pour exécuter du code hautement dynamique, mais vous devez vous rendre pleinement conscient des risques de sécurité et de performances avant de l'utiliser.eval
, ni ne pourrait faire ce qu'il fait aveceval
.eval
, autre que l'insécurité, ne peut pas exécuter des programmes entiers comme le fait le codepad car il ne peut évaluer qu'une seule expression.eval()
interprète une chaîne comme du code. La raison pour laquelle tant de personnes vous ont mis en garde contre l'utilisation de cette fonctionnalité est qu'un utilisateur peut l'utiliser comme option pour exécuter du code sur l'ordinateur. Si vous l'avezeval(input())
etos
importé, une personne pourrait taper dansinput()
os.system('rm -R *')
lequel supprimer tous vos fichiers dans votre répertoire personnel. (En supposant que vous ayez un système Unix). L'utilisationeval()
est un trou de sécurité. Si vous devez convertir des chaînes dans d'autres formats, essayez d'utiliser des choses qui font cela, commeint()
.la source
eval
avecinput()
est une faille de sécurité. Ne mettez pasinput()
dans une déclaration eval et tout ira bien.eval
va de même pour la sécurité dans de nombreux cas.input
prend généralement ses données depuis la console, l'utilisateur peut simplement quitter le programme et taper derm -R *
toute façon ...Beaucoup de bonnes réponses ici, mais aucune ne décrit l'utilisation de
eval()
dans le contexte de itsglobals
etlocals
kwargs, c'est-à-direeval(expression, globals=None, locals=None)
(voir la documentationeval
ici ).Ceux-ci peuvent être utilisés pour limiter les fonctions disponibles via la
eval
fonction. Par exemple, si vous chargez un nouvel interpréteur python, lelocals()
etglobals()
sera le même et ressemblera à ceci:Il existe certainement des fonctions au sein du
builtins
module qui peuvent endommager considérablement un système. Mais il est possible de bloquer tout et tout ce dont nous ne voulons pas qu'il soit disponible. Prenons un exemple. Disons que nous voulons construire une liste pour représenter un domaine des cœurs disponibles sur un système. Pour moi, j'ai 8 cœurs, je voudrais donc une liste[1, 8]
.De même, tout
__builtins__
est disponible.D'accord. Nous voyons donc là une fonction que nous voulons exposer et un exemple d'une méthode (parmi tant d'autres qui peuvent être beaucoup plus complexes) que nous ne voulons pas exposer. Alors bloquons tout.
Nous avons effectivement bloqué toutes les
__builtins__
fonctions et, à ce titre, apporté un niveau de protection à notre système. À ce stade, nous pouvons commencer à ajouter des fonctions que nous voulons exposer.Maintenant, nous avons la
cpu_count
fonction disponible tout en bloquant tout ce que nous ne voulons pas. À mon avis, c'est super puissant et clairement de la portée des autres réponses, pas une mise en œuvre commune. Il y a de nombreuses utilisations pour quelque chose comme ça et tant qu'il est manipulé correctement, je pense personnellement qu'ileval
peut être utilisé en toute sécurité à grande valeur.NB
Une autre chose intéressante à ce sujet
kwargs
est que vous pouvez commencer à utiliser des raccourcis pour votre code. Supposons que vous utilisez eval dans le cadre d'un pipeline pour exécuter du texte importé. Le texte n'a pas besoin d'avoir un code exact, il peut suivre un format de fichier modèle et toujours exécuter tout ce que vous souhaitez. Par exemple:la source
En Python 2.x
input(...)
est équivalent àeval(raw_input(...))
, en Python 3.x araw_input
été renomméinput
, ce qui, je le soupçonne, a semé la confusion (vous regardiez probablement la documentation deinput
Python 2.x). De plus,eval(input(...))
cela fonctionnerait bien dans Python 3.x, mais déclencherait unTypeError
dans Python 2.Dans ce cas,
eval
est utilisé pour contraindre la chaîne renvoyée deinput
dans une expression et interprétée. En général, cela est considéré comme une mauvaise pratique.la source
input
signifie ce qui araw_input
fait dans 2.x.Peut-être un exemple trompeur de lecture d'une ligne et d'interprétation.
Essayez de
eval(input())
taper"1+1"
- cela devrait imprimer2
. Eval évalue les expressions.la source
eval()
évalue la chaîne passée en tant qu'expression Python et renvoie 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 pour laquelle vous pourriez être confus est que le code que vous avez cité implique un niveau d'indirection. L'appel de fonction interne (entrée) est exécuté en premier afin que l'utilisateur voit l'invite "bla". Imaginons qu'ils répondent avec "1 + 1" (guillemets ajoutés pour plus de clarté, ne les tapez pas lors de l'exécution de votre programme), la fonction d'entrée renvoie cette chaîne, qui est ensuite transmise à la fonction externe (eval) qui interprète la chaîne et renvoie le résultat (2).
En savoir plus sur eval ici .
la source
eval()
, comme son nom l'indique, évalue l'argument passé.raw_input()
est maintenantinput()
dans les versions python 3.x. Ainsi, l'exemple d'utilisation le plus couranteval()
est son utilisation pour fournir les fonctionnalitésinput()
fournies dans la version 2.x de python. raw_input a renvoyé les données entrées par l'utilisateur sous forme de chaîne, tandis que l'entrée a évalué la valeur des données entrées et l'a renvoyée.eval(input("bla bla"))
reproduit ainsi la fonctionnalité deinput()
dans 2.x, c'est-à-dire d'évaluer les données saisies par l'utilisateur.En bref:
eval()
évalue les arguments qui lui sont passés et donceval('1 + 1')
retournent 2.la source
L'une des applications utiles de
eval()
est d'évaluer les expressions python à partir d'une chaîne. Par exemple, charge à partir d'une représentation sous forme de chaîne de fichier du dictionnaire:Lisez-le en tant que variable et modifiez-le:
Production:
la source
eval
?Je suis en retard pour répondre à cette question, mais personne ne semble répondre clairement à la question.
Si un utilisateur entre une valeur numérique,
input()
retournera une chaîne.Donc,
eval()
va évaluer la valeur retournée (ou l'expression) qui est une chaîne et retourner un entier / flottant.Bien sûr, c'est une mauvaise pratique.
int()
oufloat()
doit être utilisé à la place deeval()
dans ce cas.la source
Une autre option si vous souhaitez limiter la chaîne d'évaluation à des littéraux simples est d'utiliser
ast.literal_eval()
. Quelques exemples:De la documentation :
Quant à savoir pourquoi c'est si limité, à partir de la liste de diffusion :
la source
ast.literal_eval
ne prend pas en charge les opérateurs, contrairement à votre'1+1'
exemple. Néanmoins, il prend en charge les listes, les nombres, les chaînes, etc., et constitue donc une bonne alternative pour leseval
cas d'utilisation courants .