2009-02-18 9 views
14

Comment faire une compilation conditionnelle en Python?Compilation conditionnelle en Python

Utilise-t-il DEF?

+1

S'il vous plaît donner un exemple de ce que vous entendez par « compilation conditionnelle » et la façon dont vous réellement l'utiliser dans un programme Python réel. –

Répondre

22

Python n'est pas compilé dans le même sens que C ou C++ ou même Java, les fichiers python sont compilés "à la volée", vous pouvez le considérer comme similaire à un langage interprété comme Basic ou Perl.

Vous pouvez faire quelque chose d'équivalent à la compilation conditionnelle en utilisant simplement une instruction if. Par exemple:

if FLAG: 
    def f(): 
     print "Flag is set" 
else: 
    def f(): 
     print "Flag is not set" 

Vous pouvez faire la même chose pour les classes de création, la définition de variables et à peu près tout. Le moyen le plus proche d'imiter IFDEF serait d'utiliser la fonction hasattr. .: par exemple

if hasattr(aModule, 'FLAG'): 
    # do stuff if FLAG is defined in the current module. 

Vous pouvez également utiliser un essai/sauf clause pour attraper les erreurs de nom, mais la façon dont idiomatiques serait de définir une variable None en haut de votre script.

  1. Le code Python est un octet compilé dans une forme intermédiaire comme Java, mais il n'y a généralement pas d'étape de compilation séparée. Les fichiers sources "bruts" se terminant par .py sont exécutables.
+0

Y at-il quelque chose comme ifdef? – user46646

+0

Pragmatiquement vrai, mais techniquement faux. Python IS est compilé dans le même sens que Java, mais l'étape de compilation n'est pas explicite au programmeur. – Arafangion

+0

@Arafangion: Directement au but ... pourquoi ne développez-vous pas ce [petit] peu dans une réponse? – paprika

3

Cela n'a pas beaucoup de sens dans un environnement dynamique. Si vous êtes à la recherche de définition conditionnelle de fonctions, vous pouvez utiliser if:

if happy: 
    def makemehappy(): 
     return "I'm good" 
+0

merci pour votre réponse – user46646

+0

Le problème est que cela ne fonctionne pas si heureux n'est pas défini. –

17

Il est en fait un moyen d'obtenir la compilation conditionnelle, mais il est très limité. Le code __debug__ est un cas particulier. Lors de l'appel de python avec les options -O ou -OO, __debug__ sera faux, et le compilateur ignorera cette instruction. Ceci est principalement utilisé avec les assertions, ce qui explique pourquoi les assertions disparaissent si vous compilez vraiment vos scripts avec l'optimisation. Par conséquent, si votre objectif est d'ajouter du code de débogage mais d'empêcher le ralentissement ou la modification d'une version 'release', cela correspond à ce que vous voulez. Mais vous ne pouvez pas attribuer de valeur à __debug__, c'est donc à peu près tout ce que vous pouvez utiliser pour.

4

Python compile automatiquement un module lorsque vous l'importez, de sorte que la seule façon d'éviter de le compiler est de ne pas l'importer. Vous pouvez écrire quelque chose comme:

if some_condition: 
    import some_module 

Mais cela ne fonctionnerait que pour des modules complets. En C et C++, vous utilisez généralement un préprocesseur pour la compilation conditionnelle. Il n'y a rien qui vous empêche d'utiliser un préprocesseur sur votre code Python, vous pouvez donc écrire quelque chose comme:

#ifdef SOME_CONDITION 
def some_function(): 
    pass 
#endif 

Exécuter que par un préprocesseur C et vous auriez la compilation réelle conditionnelle et some_function ne sera défini que si SOME_CONDITION est défini.MAIS (et c'est important): La compilation conditionnelle n'est probablement pas ce que vous voulez. N'oubliez pas que lorsque vous importez un module, Python exécute simplement le code. Les instructions def et class dans le module sont en réalité exécutées lorsque vous importez le module. Ainsi, la manière typique de mettre en œuvre ce que les autres langues utiliseraient la compilation conditionnelle pour est juste une normale instruction if, comme:

if some_condition: 
    def some_function(): 
    pass 

Cela ne définit some_function si some_condition est vrai.

C'est ce genre de choses qui rend les langages dynamiques si puissants tout en restant conceptuellement simple.

10

Utilisez pypreprocessor

qui peut aussi être trouvé sur PYPI (Python Package Index) et peut être tiré par les cheveux à l'aide pip.

L'exemple d'utilisation basique:

from pypreprocessor import pypreprocessor 

pypreprocessor.parse() 

#define debug 

#ifdef debug 
print('The source is in debug mode') 
#else 
print('The source is not in debug mode') 
#endif 

Vous pouvez également sortie le code dans un fichier post-traité en spécifiant ...

pypreprocessor.output = 'output_file_name.py' 

partout entre l'importation et l'appel pypreprocessor pour analyser().

Le module est essentiellement l'implémentation python de la compilation conditionnelle du préprocesseur C.

Sidenote: Ceci est compatible avec python2x et python 3k

Disclaimer: Je suis l'auteur de pypreprocessor

Mise à jour:

j'oublié de mentionner avant. Contrairement aux approches if/else ou if _debug: décrites dans d'autres réponses, il s'agit d'un vrai préprocesseur. Le bytecode produit ne contiendra pas le code exclu conditionnellement.

Questions connexes