2009-02-18 22 views
14

¿Cómo hacer una compilación condicional en Python?Compilación condicional en Python

¿Está utilizando DEF?

+1

Sírvanse proporcionar un ejemplo de lo que entendemos por "la compilación condicional" y cómo se utilizan realmente en un programa Python real. –

Respuesta

22

Python no se compila en el mismo sentido que C o C++ o incluso Java, los archivos python se compilan "sobre la marcha", se puede pensar que es similar a un lenguaje interpretado como Basic o Perl.

Puede hacer algo equivalente a la compilación condicional con solo usar una instrucción if. Por ejemplo:

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

Puede hacer lo mismo para las clases de creación, configuración de variables y prácticamente todo.

La manera más cercana de imitar a IFDEF sería usar la función hasattr. Ej .:

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

También es posible usar un try/except para detectar errores de nombre, pero la forma idiomática sería establecer una variable en Ninguno en la parte superior de su script.

  1. El código Python se compila en bytes en una forma intermedia como Java, sin embargo, generalmente no hay un paso de compilación por separado. Los archivos fuente "en bruto" que terminan en .py son ejecutables.
+0

¿Hay algo como ifdef? – user46646

+0

Pragmáticamente cierto, pero técnicamente falso. Python se compila en el mismo sentido que Java, sin embargo, el paso de compilación no se hace explícito para el programador. – Arafangion

+0

@Arafangion: Directo al punto ... ¿por qué no expandes esto un [pequeño] poquito en una respuesta? – paprika

3

No tiene mucho sentido en un entorno dinámico. Si usted está buscando para la definición de las funciones condicional, puede utilizar if:

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

gracias por su respuesta – user46646

+0

El problema es que no funciona si feliz no está definido. –

17

realidad, hay una manera de conseguir la compilación condicional, pero es muy limitado.

if __debug__: 
    doSomething() 

La bandera __debug__ es un caso especial. Al llamar a python con las opciones -O o -OO, __debug__ será falso y el compilador ignorará esa declaración. Esto se usa principalmente con las afirmaciones, que es por lo que las afirmaciones desaparecen si realmente compila sus scripts con optimización.

Así que si su objetivo es agregar código de depuración, pero evitar que se ralentice o que afecte a una compilación 'liberar', esto hace lo que quiere. Pero no puede asignar un valor a __debug__, así que eso es todo lo que puede usar.

4

Python compila un módulo automáticamente al importarlo, por lo que la única manera de evitar la compilación es no importarlo. Puede escribir algo como:

if some_condition: 
    import some_module 

Pero eso solo funcionaría para módulos completos. En C y C++ normalmente utiliza un preprocesador para la compilación condicional. No hay nada que nos impida el uso de un preprocesador en el código Python, por lo que podría escribir algo como:

#ifdef SOME_CONDITION 
def some_function(): 
    pass 
#endif 

Run que a través de un preprocesador C y tendrías real compilación condicional y some_function solamente se definirá si SOME_CONDITION se define.

PERO (y esto es importante): la compilación condicional probablemente no sea la que usted desea. Recuerde que cuando importa un módulo, Python simplemente ejecuta el código en él. Las sentencias def y class en el módulo son en realidad ejecutadas cuando se importa el módulo. Así que la forma típica de la aplicación de lo que otros idiomas utilizarían para la compilación condicional es sólo una declaración normal si, como:

if some_condition: 
    def some_function(): 
    pass 

Esto sólo definir si some_functionsome_condition es cierto.

Son cosas como esta que hacen que los lenguajes dinámicos sean tan potentes sin dejar de ser conceptualmente simples.

10

Uso pypreprocessor

que también se pueden encontrar en PYPI (Python Package Index) y se pueden recuperar usando PIP.

El ejemplo básico de uso es:

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 

Usted también puede enviar el código de posprocesamiento a un archivo especificando ...

pypreprocessor.output = 'output_file_name.py' 

en cualquier lugar entre la importación pypreprocessor y la llamada a analizar().

El módulo es esencialmente la implementación python de la compilación condicional del preprocesador C.

Nota al margen: Este es compatible tanto con python2x y Python 3k

responsabilidad: yo soy el autor de pypreprocessor

Actualización:

me olvidó mencionar antes. A diferencia de los enfoques if/else o if _debug: descritos en otras respuestas, este es un verdadero preprocesador. El bytecode producido no contendrá el código que está excluido condicionalmente.

Cuestiones relacionadas