¿Cómo hacer una compilación condicional en Python?Compilación condicional en Python
¿Está utilizando DEF?
¿Cómo hacer una compilación condicional en Python?Compilación condicional en Python
¿Está utilizando DEF?
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.
¿Hay algo como ifdef? – user46646
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
@Arafangion: Directo al punto ... ¿por qué no expandes esto un [pequeño] poquito en una respuesta? – paprika
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"
gracias por su respuesta – user46646
El problema es que no funciona si feliz no está definido. –
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.
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_function
some_condition
es cierto.
Son cosas como esta que hacen que los lenguajes dinámicos sean tan potentes sin dejar de ser conceptualmente simples.
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.
se puede utilizar el método discutido aquí: Determine if variable is defined in Python como sustituto de #ifdef
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. –