262 votes

Utilisation de la fonction eval() de Python et de ast.literal_eval()

J'ai une situation avec un certain code où eval() est apparu comme une solution possible. Maintenant, je n'ai jamais eu à utiliser eval() mais j'ai trouvé de nombreuses informations sur le danger potentiel qu'il peut représenter. Cela dit, je suis très prudent quant à son utilisation.

Ma situation est la suivante : un utilisateur saisit des données :

datamap = input('Provide some data here: ')

Donde datamap doit être un dictionnaire. J'ai fait des recherches et j'ai trouvé que eval() pourrait s'en sortir. J'ai pensé que je pourrais vérifier le type d'entrée avant d'essayer d'utiliser les données et que ce serait une précaution de sécurité viable.

datamap = eval(input('Provide some data here: ')
if not isinstance(datamap, dict):
    return

J'ai lu la documentation et je ne sais toujours pas si cela est sûr ou non. Est-ce que l'évaluation évalue les données dès qu'elles sont saisies ou après l'exécution de l'opération ? datamap variable est appelée ?

Est-ce que le ast du module .literal_eval() la seule option sûre ?

6voto

Chinasaur Points 910

Si tout ce dont vous avez besoin est un dictionnaire fourni par l'utilisateur, la meilleure solution possible est la suivante json.loads . La principale limitation est que les dicts json nécessitent des clés de type chaîne. De plus, vous ne pouvez fournir que des données littérales, mais c'est aussi le cas pour literal_eval .

3voto

M Haziq Points 208

J'étais coincé avec ast.literal_eval() . Je l'ai essayé dans le débogueur IntelliJ IDEA, et il retournait toujours None sur la sortie du débogueur.

Mais plus tard, quand j'ai assigné sa sortie à une variable et l'ai imprimée dans le code. Cela a bien fonctionné. Partage d'un exemple de code :

import ast
sample_string = '[{"id":"XYZ_GTTC_TYR", "name":"Suction"}]'
output_value = ast.literal_eval(sample_string)
print(output_value)

C'est la version 3.6 de Python.

0voto

João Raffs Points 91

Au lieu d'importer ast Je viens d'attribuer eval(data.decode('utf-8)) à la variable du dictionnaire, comme ceci :

dict = eval(data.decode('utf-8'))

fonctionne comme un charme !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X