Maison >développement back-end >Tutoriel Python >Introduction aux différences entre l'utilisation de la fonction eval et ast.literal_eval en Python (image et texte)

Introduction aux différences entre l'utilisation de la fonction eval et ast.literal_eval en Python (image et texte)

黄舟
黄舟original
2017-08-10 14:00:0211075parcourir

La fonction eval est toujours très utile pour convertir des types de données en Python. Sa fonction est de restaurer les données sur elles-mêmes ou sur un type de données qui peut y être converti. Alors, quelle est la différence entre eval et ast.literal_val() ? Cet article vous présentera des informations pertinentes sur la différence entre les fonctions eval et ast.literal_eval en Python. Les amis dans le besoin peuvent s'y référer.

Préface

Comme nous le savons tous, en Python, que se passe-t-il si vous souhaitez convertir une liste de chaînes, un tuple, un dict dans le type d'origine ? A ce moment, vous penserez naturellement à eval. La fonction eval est toujours très utile pour convertir des types de données en python. Sa fonction est de restaurer les données vers elles-mêmes ou vers le type de données dans lequel elles peuvent être converties. Jetons un coup d'œil à l'exemple de code :

string <==> >

chaîne <==> tuple

chaîne < ;= => dict

C'est-à-dire que l'utilisation de eval peut réaliser la conversion de tuples, de listes et de chaînes de type dictionnaire en tuples, listes, et des dictionnaires De plus, eval peut également calculer directement l'entrée du type de chaîne de caractères

. Par exemple, elle calculera directement le résultat de la chaîne de calcul « 1+1 ».

Du point de vue ci-dessus, la fonction eval est très puissante, c'est-à-dire qu'elle peut effectuer une conversion de type entre chaîne et liste, tuple, dict, et peut également être utilisé comme calculatrice! De plus, elle peut traiter toutes les chaînes qu'elle peut analyser, quelles que soient les conséquences possibles ! Derrière la puissance d’eval se cache donc un énorme risque de sécurité ! ! ! Par exemple, l'utilisateur saisit de manière malveillante la chaîne suivante


open(r'D://filename.txt', 'r').read()

__import__('os').system('dir')

__import__('os').system('rm -rf /etc/*')

Ensuite eval ignorera tout, affichera la structure des répertoires de votre ordinateur, lira les fichiers, supprimera des fichiers... S'il s'agit d'une opération plus sérieuse comme le formatage du disque, elle le fera également ! ! !

Cela conduit donc à une autre méthode de traitement sûre ast.literal_eval Vous pouvez d'abord lire stackoverflow et les explications officielles de Python à ce sujet !

stackoverflow

Documentation officielle Python

Pour faire simple, le module ast aide les applications Python à gérer l'analyse grammaticale abstraite. La fonction

sous ce module : déterminera si le contenu à calculer est de type python légal après calcul. Si tel est le cas, l'opération sera effectuée, sinon l'opération ne sera pas effectuée. literal_eval()

Par exemple, si les opérations de calcul ci-dessus et les opérations dangereuses sont remplacées par

, leur exécution sera refusée. ast.literal_eval()

Erreur de valeur, chaîne illégale !

Seuls les types Python légaux seront exécutés, réduisant ainsi considérablement les risques du système !

Donc, pour des raisons de sécurité, lors de la conversion de types de chaînes, il est préférable d'utiliser la fonction

ast.literal_eval()

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn