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
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
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.
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).
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.
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.