Antwort
Python ist nicht im selben Sinne kompiliert wie C oder C++ oder Java, Python-Dateien werden "on the fly" kompiliert, man kann es sich ähnlich wie eine interpretierte Sprache wie Basic oder Perl vorstellen.
Sie können etwas tun, das dem bedingten Kompilieren entspricht, indem Sie einfach eine if-Anweisung verwenden. Zum Beispiel:
if FLAG:
def f():
print "Flag is set"
else:
def f():
print "Flag is not set"
Sie können das gleiche für die Erstellung Klassen, Einstellung von Variablen und so ziemlich alles tun.
Die einfachste Möglichkeit, IFDEF nachzuahmen, wäre die Verwendung der Funktion hasattr. Z.B .:
if hasattr(aModule, 'FLAG'):
# do stuff if FLAG is defined in the current module.
Sie auch einen try/except-Namen Fehler verwenden könnte zu fangen, aber die idiomatische Weise eine Variable Keine am Anfang des Skripts zu setzen wäre.
- Python-Code ist ein Byte, das in eine Zwischenform wie Java kompiliert wird, es gibt jedoch im Allgemeinen keinen separaten Kompilierungsschritt. Die "rohen" Quelldateien, die auf .py enden, sind ausführbar.
Gibt es sowas wie ifdef? – user46646
Pragmatisch wahr, aber technisch falsch. Python IS wird im gleichen Sinne wie Java kompiliert, jedoch wird der Kompilierungsschritt dem Programmierer nicht explizit gemacht. – Arafangion
@Arafangion: Direkt auf den Punkt ... warum erweitern Sie dies nicht ein [kleines] bisschen in einer Antwort? – paprika
Ist in einer dynamischen Umgebung nicht sinnvoll. Wenn Sie für die bedingte Definition von Funktionen suchen, können Sie if
verwenden:
if happy:
def makemehappy():
return "I'm good"
danke für Ihre Antwort – user46646
Das Problem ist, dass es nicht funktioniert, wenn glücklich ist nicht definiert. –
es tatsächlich eine Art und Weise ist die bedingte Kompilierung zu erhalten, aber es ist sehr begrenzt.
if __debug__:
doSomething()
Die __debug__
Flagge ist ein Sonderfall. Beim Aufruf von Python mit den Optionen -O
oder -OO
wird __debug__
falsch sein, und der Compiler ignoriert diese Anweisung. Dies wird hauptsächlich bei Behauptungen verwendet, weshalb Behauptungen weggehen, wenn Sie Ihre Skripte wirklich mit Optimierung kompilieren.
Wenn Sie also versuchen, Debugging-Code hinzuzufügen, aber verhindern, dass der Build langsamer wird oder sich auf andere Weise auf einen Release-Build auswirkt, ist dies das, was Sie wollen. Aber Sie können __debug__
keinen Wert zuweisen, das ist also alles, was Sie dafür verwenden können.
Python kompiliert ein Modul automatisch, wenn Sie es importieren. Die einzige Möglichkeit, es zu kompilieren, besteht darin, es nicht zu importieren. Sie können etwas schreiben wie:
if some_condition:
import some_module
Aber das würde nur für komplette Module funktionieren. In C und C++ verwenden Sie normalerweise einen Präprozessor für die bedingte Kompilierung. Es gibt nichts, was man von der Verwendung eines Prä-Prozessors auf Ihrem Python-Code zu stoppen, so könnte man so etwas schreiben:
#ifdef SOME_CONDITION
def some_function():
pass
#endif
Run, die durch einen C-Präprozessor und Sie echten bedingte Kompilierung haben würden und some_function
nur definiert werden, wenn SOME_CONDITION
ist definiert.
ABER (und das ist wichtig): Bedingte Kompilierung ist wahrscheinlich nicht das, was Sie wollen. Denken Sie daran, dass Python beim Importieren eines Moduls einfach den darin enthaltenen Code ausführt. Die Def- und Klassenanweisungen im Modul werden beim Importieren des Moduls tatsächlich ausgeführt. So ist die typische Art und Weise der Umsetzung, was andere Sprachen bedingte Kompilierung verwenden würde ist nur eine normale if-Anweisung, wie:
if some_condition:
def some_function():
pass
Dies wird nur some_function
definieren, wenn some_condition
wahr ist.
Es ist so etwas, das dynamische Sprachen so mächtig macht, während konzeptionell einfach bleibt.
Verwenden pypreprocessor
die auch auf PYPI (Python Package Index) gefunden werden kann und pip mit abgerufen werden können.
Das grundlegende Beispiel der Verwendung ist:
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
Sie können auch die Ausgabe der nachbearbeiteten Code in eine Datei mit der Angabe ...
pypreprocessor.output = 'output_file_name.py'
irgendwo zwischen dem pypreprocessor Import und dem Aufruf zu analysieren().
Das Modul ist im Wesentlichen die Python-Implementierung der C-Präprozessor-bedingten Kompilierung.
Sidenote: Dies ist kompatibel mit Python2X und Python 3k
Disclaimer: Ich bin der Autor pypreprocessor
Update:
ich vor vergaß zu erwähnen. Im Gegensatz zu den in anderen Antworten beschriebenen Ansätzen ist dies ein echter Präprozessor. Der erzeugte Bytecode enthält nicht den Code, der bedingt ausgeschlossen ist.
Sie könnten die Methode hier besprochen verwenden: Determine if variable is defined in Python als Ersatz für #ifdef
Bitte geben Sie ein Beispiel, was Sie unter „bedingter Kompilierung“ und wie Sie würde es tatsächlich in einem echten Python-Programm. –