Python >> Tutoriel Python >  >> Python

Python compile()

Si vous êtes comme moi, vous aimez ces TLDR ; aperçus pour saisir rapidement la situation dans son ensemble. Voici le mien sur le compile() de Python fonction :

compile() intégré de Python La méthode renvoie un objet de code exécutable sous la forme d'un "arbre de syntaxe abstraite" représenté par un ast objet. En passant cet objet code dans le exec() ou eval() fonctions, vous pouvez l'exécuter dynamiquement dans votre code Python. De cette façon, vous pouvez créer par programmation du code source et l'exécuter au moment de l'exécution. Pour utiliser la fonction, passez le code de la chaîne à exécuter, le nom du fichier et le mode d'exécution. Par exemple compile('print("hi")', '<string>', 'exec') crée un objet de code composé d'une ligne print("hi") .

Cet article vous montre comment utiliser le compile() intégré de Python méthode.

Utiliser compile()

Apprenez par l'exemple ! Supposons que vous ayez un fichier de code avec le contenu suivant :

# some_code.py file
customers = {"Alice": 40000, "Bob": 33000}
print(f"Bob: {customers['Bob']}")

Voici un exemple d'utilisation du compile() fonction intégrée.

# Read the code from the file or define it explicitly:
code = 'customers = {"Alice": 40000, "Bob": 33000}\nprint(f"Bob: {customers[\'Bob\']}")'

# Create the ast code object
code_obj = compile(code, '<string>', 'exec')

# Execute the ast code object
exec(code_obj)

# Result:
# Bob: 33000

Tout d'abord, vous créez le code sous forme de chaîne. Deuxièmement, vous passez la chaîne dans le compile() fonction pour créer un ast objet. Vous pouvez ensuite passer cet objet dans le exec() fonction et exécutez-le dynamiquement.

Compilation vidéo()

Pourquoi utiliser compile() au lieu de exec() avec une chaîne ?

Avant de plonger dans la syntaxe, vous n'êtes peut-être pas motivé à utiliser le compile() fonction en premier lieu. Pourquoi? Parce que vous pouvez aussi utiliser le exec() fonction sur une chaîne au lieu d'un objet de code.

exec() de Python La fonction exécute le code Python que vous transmettez en tant qu'argument de chaîne ou d'objet exécutable. C'est ce qu'on appelle l'exécution dynamique car, contrairement à la norme statique Code Python, vous pouvez générer du code et l'exécuter lors de l'exécution. De cette façon, vous pouvez exécuter du code Python créé par programme.

Voici le même code sans compile() :

code = 'customers = {"Alice": 40000, "Bob": 33000}\nprint(f"Bob: {customers[\'Bob\']}")'
exec(code)
# Bob: 33000

La sortie est la même. Cependant, il y a deux avantages d'utiliser un objet code :

  • Vous le rendez explicite. Sans compiler explicitement la chaîne, le exec() méthode ferait implicitement le même travail. Ainsi, si vous avez besoin d'exécuter plusieurs fois le même code, vous pouvez économiser une charge de compilation importante en le compilant une seule fois à l'avance.
  • Vous pouvez utiliser le puissant ast objecter autrement. Cela vous donne accès à certaines méthodes d'assistance et à des informations supplémentaires sur le code telles que les noms définis dans le code :
>>> code_obj.co_names
('customers', 'print')

Vous obtenez ces informations à partir d'une chaîne compilée ce qui est très pratique !

Syntaxe compile()

Vous pouvez utiliser le compile() méthode avec plusieurs arguments différents.

Syntax: 
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) 
Arguments source Une chaîne à compiler dans un objet de code.
filename Le fichier à partir duquel le code donné dans la source a été lu. S'il s'agissait d'une chaîne, utilisez '<string>' .
mode Le mode d'exécution—doit être l'un des suivants :
'exec' — Si source est une séquence d'instructions
'eval' — Si source est une expression unique
'single' —Si source est un relevé interactif unique
Facultatif :flags=0 Contrôle quelles options du compilateur doivent être activées et quelles futures fonctionnalités doivent être autorisées.
Facultatif :dont_inherit=False Voulez-vous éviter l'héritage des options du compilateur et des futures fonctionnalités ?
Facultatif :optimize=-1 Niveau d'optimisation du compilateur :
-1 sélectionne le niveau d'optimisation de l'interpréteur comme donné par -O options.
0 sélectionne aucune optimisation et __debug__ à True .
1 spécifie que les assertions sont supprimées et définit __debug__ à False .
2 supprime également les docstrings.
Valeur de retour ast Renvoie un objet AST qui représente le code sous la forme d'un arbre de syntaxe abstraite.

Exercice Shell interactif :Comprendre compile()

Considérez le code interactif suivant :

Exercice : Imprimez le numéro associé à Alice dans le dictionnaire !


Mais avant de continuer, je suis ravi de vous présenter mon nouveau livre Python Python One-Liners (Lien Amazon).

Si vous aimez les one-liners, vous allez adorer le livre. Il vous apprendra tout ce qu'il y a à savoir sur une seule ligne de code Python. Mais c'est aussi une introduction à l'informatique , science des données, apprentissage automatique et algorithmes. L'univers en une seule ligne de Python !

Le livre est sorti en 2020 avec l'éditeur de livres de programmation de classe mondiale NoStarch Press (San Francisco).

Lien :https://nostarch.com/pythononeliners


Comment lire et compiler du code à partir d'un fichier

Supposons que vous ayez le code suivant dans un fichier de code :

# filename.py file
customers = {"Alice": 40000, "Bob": 33000}
print("Bob: " + str(customers['Bob']))

Comment lire le code d'un fichier, le compiler et l'exécuter lors de l'exécution ?

Voici le code :

# 1. Read code from file
f = open('filename.py', 'r')
code = f.read()
f.close()

# 2. Compile code string
code_obj = compile(code, 'filename.py', 'exec')

# 3. Run the code object (ast)
exec(code_obj)

Alternativement, vous pouvez également utiliser la ligne suivante pour lire le code à partir d'un fichier :

code = open('filename.py').read()

Franchement, je ne vois pas un énorme problème à ne pas fermer le fichier si vous avez un petit script et que vous n'accédez au fichier nulle part ailleurs. Python le fermera automatiquement après la fin du code.

Résumé

Le Python compile() La méthode renvoie un objet de code exécutable sous la forme d'un "arbre de syntaxe abstraite" représenté par un ast objet.

Il existe de nombreuses applications d'un ast comme suit :Vous pouvez passer cet objet de code dans le exec() ou eval() fonctions et exécutez-le dynamiquement dans votre code Python.

De cette façon, vous pouvez créer par programmation du code source et l'exécuter au moment de l'exécution.

Pour utiliser la fonction, vous devez passer le code de la chaîne à exécuter, le nom du fichier et le mode d'exécution.

Par exemple compile('print("hi")', '<string>', 'exec') serait un appel valide qui crée un objet code composé d'une ligne print("hi") .


J'espère que vous avez apprécié l'article! Pour améliorer votre formation Python, vous pouvez rejoindre la populaire et gratuite Finxter Email Academy :

Voulez-vous améliorer vos compétences Python d'une manière amusante et facile à consommer ? Considérez les ressources suivantes et devenez un maître codeur !


Prochain article