Comment faire une compilation conditionnelle en Python?Compilation conditionnelle en Python
Utilise-t-il DEF?
Comment faire une compilation conditionnelle en Python?Compilation conditionnelle en Python
Utilise-t-il DEF?
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.
Y at-il quelque chose comme ifdef? – user46646
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
@Arafangion: Directement au but ... pourquoi ne développez-vous pas ce [petit] peu dans une réponse? – paprika
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"
merci pour votre réponse – user46646
Le problème est que cela ne fonctionne pas si heureux n'est pas défini. –
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.
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.
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.
Vous pouvez utiliser la méthode décrite ici: Determine if variable is defined in Python comme substitut pour #ifdef
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. –