75 votes

Comment feriez-vous l'équivalent des directives du préprocesseur en Python?

Existe-t-il un moyen de faire les directives de préprocesseur suivantes en Python?

 #if DEBUG

< do some code >

#else

< do some other code >

#endif
 

127voto

habnabit Points 4245

Il y a __debug__ , qui est une valeur spéciale que le compilateur effectue un prétraitement.

 if __debug__:
  print "If this prints, you're not running python -O."
else:
  print "If this prints, you are running python -O!"
 

__debug__ sera remplacé par une constante 0 ou 1 par le compilateur, et l'optimiseur supprimera toutes les lignes if 0: avant que votre source ne soit interprétée.

40voto

Evan Plaice Points 5677

J'ai écrit un python de préprocesseur appelé pypreprocessor qui fait exactement ce que vous décrivez.

La source et de la documentation est disponible sur Google Code.

L'emballage peut également être téléchargé/installé par le biais de la PYPI.

Voici un exemple d'accomplir ce que vous décrivez.

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

pypreprocessor est capable de beaucoup plus que juste sur la volée de prétraitement. Voir plus d'exemples de cas d'utilisation découvrez le projet sur Google Code.

Mise à jour: Plus d'infos sur pypreprocessor

La façon dont je peux faire le pré-traitement est simple. À partir de l'exemple ci-dessus, le préprocesseur importations d'un pypreprocessor objet qui est créé dans le pypreprocessor module. Lorsque vous appelez parse() sur le préprocesseur auto-consomme le fichier est importé dans et génère un temp copie de lui-même que les commentaires de tous le préprocesseur code (pour éviter le préprocesseur d'appeler récursivement dans une boucle infinie) et les commentaires de toutes les parties inutilisées.

En commentant les lignes, plutôt que de les enlever, est nécessaire pour préserver les numéros de ligne en cas d'erreur retraçage si le module déclenche une exception ou se bloque. Et j'ai même été jusqu'à réécrire l'erreur de traçage rapport reflètent le bon nom de fichier du module qui s'est écrasé.

Ensuite, le fichier généré contenant le postprocessed code est exécuté à la volée.

L'avantage de l'utilisation de cette méthode par rapport à un simple ajout d'un tas de si les déclarations en ligne dans le code, il n'y aura pas d'exécution de perte de temps à l'évaluation de l'inutile consolidés, puisque le commentaire sur des portions de code sera exclu de la compilation .pyc fichiers.

L'inconvénient (et ma raison première de la création du module), c'est que vous ne pouvez pas exécuter python 2x et python 3 fois dans le même fichier, car pythons interprète exécute une syntaxe complète vérifier avant d'exécuter le code et le rejet d'une version spécifique de code avant le préprocesseur est autorisé à s'exécuter ::sigh::. Mon objectif initial était de pouvoir développer 2x et 3x code côte-à-côte dans le même fichier qui permettrait de créer une version spécifique du bytecode en fonction de ce qu'il est en cours d'exécution sur.

De toute façon, le préprocesseur module est encore très utile pour la mise en œuvre commune c-style de prétraitement des capacités. Ainsi que, le préprocesseur est capable de délivrer de la postprocessed code dans un fichier pour l'utiliser plus tard si vous le souhaitez.

Aussi, si vous souhaitez générer une version qui a toutes les directives de préprocesseur, ainsi que le #ifdefs qui sont exclus supprimé c'est aussi simple que de créer un drapeau dans le préprocesseur du code avant d'appeler parse(). Cela fait de supprimer le code d'une version spécifique du fichier source à une seule étape du processus (vs ramper à travers le code et le retrait si les déclarations manuellement).

25voto

Charlie Martin Points 62306

Je suppose que tu vas détester cette réponse. La façon dont vous faites cela en Python est

 # code here
if DEBUG:
   #debugging code goes here
else:
   # other code here.
 

Puisque python est un interpréteur, il n’ya pas d’étape de prétraitement à appliquer, ni d’avantage particulier d’avoir une syntaxe spéciale.

11voto

Robert Gould Points 29406

Vous pouvez utiliser le préprocesseur en Python. Il suffit d’exécuter vos scripts dans cpp (C-Preprocessor) dans votre répertoire bin. Cependant, je l'ai fait avec Lua et les avantages d'une interprétation facile ont dépassé la compilation plus complexe IMHO.

5voto

phihag Points 89765

Vous pouvez simplement utiliser les constructions de langage normales:

 DEBUG = True
if DEBUG:
  # Define a function, a class or do some crazy stuff
  def f():
    return 23
else:
  def f():
    return 42
 

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