Pregunta

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

#if DEBUG

< do some code >

#else

< do some other code >

#endif
¿Fue útil?

Solución

Hay __debug__, que es un valor especial que el compilador procesa previamente.

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

if 0: será reemplazado por una constante 0 o 1 por el compilador, y el optimizador eliminará cualquier línea <=> antes de que su fuente sea interpretada.

Otros consejos

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

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

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

Aquí hay un ejemplo para lograr lo que estás describiendo.

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 el preprocesamiento sobre la marcha. Para ver más ejemplos de casos de uso, consulte el proyecto en Google Code.

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

La forma en que realizo el preprocesamiento es simple. Del ejemplo anterior, el preprocesador importa un objeto pypreprocessor que se crea en el módulo pypreprocessor. Cuando llama a parse () en el preprocesador, autoconsume el archivo al 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 bucle infinito) y comenta todas las porciones no utilizadas.

Es necesario comentar las líneas, en lugar de eliminarlas, para preservar los números de línea en las trazas de error si el módulo arroja una excepción o falla. E incluso he llegado a reescribir el error de rastreo para informar que refleja el nombre de archivo correcto del módulo que se bloqueó.

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

La ventaja de usar este método sobre la simple adición de un montón de sentencias if en línea en el código es que no se perderá tiempo de ejecución al evaluar las declaraciones inútiles porque las partes 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 pythons ejecuta una verificación de sintaxis completa antes de ejecutar el código y rechazará cualquier versión específica código antes de que el preprocesador pueda ejecutar :: suspiro ::. Mi objetivo original era poder desarrollar código 2x y 3x lado a lado en el mismo archivo que crearía un código de bytes específico de la versión dependiendo de en qué se esté ejecutando.

De cualquier forma, el módulo de preprocesador sigue siendo muy útil para implementar capacidades comunes de preprocesamiento de estilo C. Además, el preprocesador es capaz de enviar el código postprocesado a un archivo para su uso posterior si lo desea.

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

Sospecho que odiarás esta respuesta. La forma de hacerlo en Python es

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

Dado que Python es un intérprete, no hay que aplicar ningún paso de preprocesamiento, y no hay una ventaja particular de tener una sintaxis especial.

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

Puede 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

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 líneas que tienen una declaración '#DEBUG'. 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
  • Python si no puede eliminar elementos de las matrices.
  • Los precompiladores C no manejan #! u otras líneas que comienzan con # según sea necesario.
  • pypreprocessor parece ser específico de Python

Utilice un m4 común en su lugar, así:

ifelse(DEBUG,True,dnl`
  < do some code >
dnl,dnl`
  < do some other code >dnl
')

ifelse(
  M4_CPU,x86_64,`
    < do some code specific for M4_CPU >
',M4_CPU,arm,`
    < do some code specific for M4_CPU >
',M4_CPU,ppc64le,`
    < do some code specific for M4_CPU >
')

ifelse(
  M4_OS,windows,`
    < do some code specific for M4_OS >
  ',M4_OS,linux,`
    < do some code specific for M4_OS >
  ',M4_OS,android,`
    < do some code specific for M4_OS >
')
  

m4 -D DEBUG = Verdadero -D M4_OS = android -D M4_CPU = arm test.py.m4 > test.py

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top