2009-02-18 9 views
14

Wie bedingte Kompilierung in Python zu tun?Bedingte Kompilierung in Python

Verwendet es DEF?

+1

Bitte geben Sie ein Beispiel, was Sie unter „bedingter Kompilierung“ und wie Sie würde es tatsächlich in einem echten Python-Programm. –

Antwort

22

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.

  1. 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.
+0

Gibt es sowas wie ifdef? – user46646

+0

Pragmatisch wahr, aber technisch falsch. Python IS wird im gleichen Sinne wie Java kompiliert, jedoch wird der Kompilierungsschritt dem Programmierer nicht explizit gemacht. – Arafangion

+0

@Arafangion: Direkt auf den Punkt ... warum erweitern Sie dies nicht ein [kleines] bisschen in einer Antwort? – paprika

3

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" 
+0

danke für Ihre Antwort – user46646

+0

Das Problem ist, dass es nicht funktioniert, wenn glücklich ist nicht definiert. –

17

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.

4

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.

10

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.