python preprocessor equivalent directive

¿Cómo haría el equivalente de las directivas de preprocesador en Python?



preprocessor directive (6)

Un método alternativo es usar un script bash para comentar partes del código que solo son relevantes para la depuración. A continuación se muestra un script de ejemplo que comenta las líneas que tienen una declaración ''#DEBUG'' en él. También puede eliminar estos marcadores de comentarios nuevamente.

if [ "$1" == "off" ]; then sed -e ''/^#/! {/#DEBUG/ s/^/#/}'' -i *.py echo "Debug mode to $1" elif [ "$1" == "on" ]; then sed -e ''/#DEBUG/ s/^#//'' -i *.py echo "Debug mode to $1" else echo "usage: $0 on | off" fi

¿Hay alguna forma de hacer las siguientes directivas de preprocesador en Python?

#if DEBUG < do some code > #else < do some other code > #endif


Hay __debug__ , que es un valor especial que el compilador preprocesa.

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

__debug__ será reemplazado con una constante 0 o 1 por el compilador, y el optimizador eliminará cualquier if 0: líneas antes de interpretar su fuente.


Puede usar el preprocesador en Python. Simplemente ejecute sus scripts a través del cpp (preprocesador C) en su directorio bin. Sin embargo, he hecho esto con Lua y los beneficios de la fácil interpretación han superado la compilación más compleja en mi humilde opinión.


Puedes usar las construcciones de lenguaje normal:

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


Sospecho que odiarás esta respuesta. La forma en que haces eso en Python es

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

Dado que python es un intérprete, no se debe aplicar un paso de preprocesamiento, y no tiene ninguna ventaja particular al tener una sintaxis especial.


Escribí un preprocesador python llamado pypreprocessor que hace exactamente lo que estás describiendo.

La fuente y la documentación están disponibles en Google Code .

El paquete también se puede descargar / instalar a través de PYPI .

Aquí hay un ejemplo para lograr lo que describes.

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 es capaz de mucho más que solo preprocesamiento sobre la marcha. Para ver más ejemplos de casos de uso, echa un vistazo al proyecto en Google Code.

Actualización: Más información sobre pypreprocessor

La forma en que logro el preprocesamiento es simple. En el ejemplo anterior, el preprocesador importa un objeto Pypreprocessor que se creó en el módulo Pypreprocessor. Cuando llama a parse () en el preprocesador, autoconsume el archivo en el que se importa y genera una copia temporal de sí mismo que comenta todo el código del preprocesador (para evitar que el preprocesador se llame recursivamente en un ciclo infinito) y comenta todas las porciones no utilizadas.

Comentar las líneas es, en lugar de eliminarlas, es necesario para preservar los números de línea en los registros de errores si el módulo arroja una excepción o falla. Incluso he llegado a reescribir la trazabilidad de errores para informar que refleja el nombre de archivo correcto del módulo que se colgó.

Luego, el archivo generado que contiene el código posprocesado se ejecuta sobre la marcha.

Lo bueno de usar este método en lugar de agregar un montón de sentencias if en línea en el código es que no se perderá tiempo de ejecución evaluando sentencias inútiles porque las porciones comentadas del código se excluirán de los archivos compilados .pyc.

La desventaja (y mi razón original para crear el módulo) es que no puede ejecutar python 2x y python 3x en el mismo archivo porque el intérprete de pitones ejecuta una verificación de sintaxis completa antes de ejecutar el código y rechazará cualquier código específico de la versión antes del el preprocesador puede ejecutar :: suspiro ::. Mi objetivo original era poder desarrollar el código 2x y 3x uno al lado del otro en el mismo archivo que crearía el bytecode específico de la versión, dependiendo de en qué se ejecuta.

De cualquier manera, el módulo de preprocesador sigue siendo muy útil para implementar capacidades comunes de preprocesamiento de estilo c. Además, el preprocesador puede enviar el código posprocesado a un archivo para su uso posterior si así lo desea.

Además, si desea generar una versión que tenga todas las directivas de preprocesador, así como cualquiera de los #ifdefs que se excluyen, es tan simple como establecer un indicador en el código del preprocesador antes de llamar a parse (). Esto hace que la eliminación de código no deseado de un archivo fuente específico de la versión sea un proceso de un solo paso (frente a rastrear el código y eliminar declaraciones if manualmente).