web-dev-qa-db-fra.com

Python équivalent pour #ifdef DEBUG

En C, nous écrivons du code comme

#ifdef DEBUG
printf("Some debug log... This could probably be achieved by python logging.Logger");
/* Do some sanity check code */
assert someCondition
/* More complex sanitycheck */
while(list->next){
assert fooCheck(list)
}

#endif

Existe-t-il un moyen de le faire en python?

Edit: j'ai eu ma réponse, et plus :) Paolo, Steven Rumbalski et J Sebastian m'ont donné les informations que je cherchais. Merci das pour la réponse détaillée, même si je n'utiliserai probablement pas de préprocesseur pour le moment.

J Sebastian, dont le commentaire a été supprimé parce que la réponse dans laquelle il a posté son commentaire, a supprimé sa réponse je pense. Il a dit que je pouvais utiliser la méthode isEnabledFor () dans Logger pour alimenter un conditionnel.

Merci à tous pour vos contributions. Ceci est ma première question. J'aimerais pouvoir accepter les réponses de paolo ou j sebastian. Mais puisque ceux-ci ont été proposés en tant que commentaires, j'accepterai la réponse de Das.

J'utiliserai probablement soit http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/ ou Logger.isEnabledFor ()

37
Spundun

Ce que vous recherchez est un préprocesseur pour python. En général, vous avez trois options:

  1. Écrivez un script/programme autodidacte qui remplace des parties de votre code source basé sur certains modèles avant de transmettre le résultat à l'interpréteur (peut être difficile)
  2. Utilisez un objectif spécial python préprocesseur comme pppp - Poor's Python Pre-Processor
  3. Utilisez un préprocesseur à usage général comme GPP

Je recommande d'essayer d'abord pppp;)

Le principal avantage d'un préprocesseur par rapport à la définition d'un indicateur DEBUG et à l'exécution de code if (DEBUG == True) est que les vérifications conditionnelles coûtent également des cycles CPU, il est donc préférable de supprimer le code qui n'a pas besoin d'être exécuté. (si l'interpréteur python ne le fait pas de toute façon), au lieu de le sauter.

7
das_weezul

Utilisation __debug__ dans votre code:

if __debug__:
    print 'Debug ON'
else:
    print 'Debug OFF'

Créez un script abc.py avec le code ci-dessus, puis

  1. Courir avec python -O abc.py
  2. Courir avec python abc.py

Observez la différence.

72

réponse de Mohammad est la bonne approche: utilisez if __debug__.

En fait, Python supprime complètement l'instruction if si l'expression est une constante statique (telle que True, False, None, __debug__, 0 et 0.0), faisant de if __debug__ une directive au moment de la compilation plutôt qu'une vérification à l'exécution:

>>> def test():
...     if __debug__:
...         return 'debug'
...     return 'not debug'
...
>>> import dis
>>> dis.dis(test)
  3           0 LOAD_CONST               1 ('debug')
              2 RETURN_VALUE

L'option -O Est expliquée en détail dans la documentation python pour options de ligne de commande , et il existe une optimisation similaire pour instructions assert .

N'utilisez donc pas de préprocesseur externe - à cet effet, vous en avez un intégré!

19
doctaphred

Si vous recherchez des assertions en Python, assert est une instruction valide python. http://docs.python.org/2/reference/simple_stmts .html # assert

2
Julien Vivenot