Es kann in 'deklarativem Python' nützlich sein. Zum Beispiel in dem unten FooDef
und BarDef
werden verwenden Klassen eine Reihe von Datenstrukturen zu definieren , die dann durch ein Paket als seinen Eingang verwendet werden, oder seine Konfiguration. Dies ermöglicht Ihnen viel Flexibilität bei der Eingabe und Sie müssen keinen Parser schreiben.
Foo_one = FooDef("This one", opt1 = False, valence = 3 )
Foo_two = FooDef("The other one", valence = 6, parent = Foo_one )
namelist = []
for i in range(6):
namelist.append("nm%03d"%i)
Foo_other = FooDef("a third one", string_list = namelist )
Bar_thing = BarDef( (Foo_one, Foo_two), method = 'depth-first')
Beachten Sie, dass diese Konfigurationsdatei eine Schleife verwendet, um eine Liste von Namen zu erstellen, die Teil der Konfiguration von sind Foo_other
. Diese Konfigurationssprache verfügt daher über einen sehr leistungsstarken Präprozessor mit einer verfügbaren Laufzeitbibliothek. Wenn Sie beispielsweise ein komplexes Protokoll suchen oder Dinge aus einer Zip-Datei extrahieren und von base64 dekodieren möchten, um Ihre Konfiguration zu generieren (dieser Ansatz wird natürlich nicht empfohlen, wenn die Eingabe möglicherweise von einem stammt nicht vertrauenswürdige Quelle ...)
Das Paket liest die Konfiguration wie folgt:
conf_globals = {}
conf_globals['FooDef']= mypkgconfig.FooDef
conf_globals['BarDef']= mypkgconfig.BarDef
fname = "user.conf"
try:
exec open(fname) in conf_globals
except Exception:
...as needed...
defs = {}
for nm,val in conf_globals.items():
if isinstance(val,mypkgconfig.DefBase):
defs[nm] = val
globals()
Wenn Sie also ein solches Paket verwenden , ist es hilfreich , endlich auf den Punkt zu kommen , wenn Sie eine Reihe von Definitionen prozedural prägen möchten:
for idx in range(20):
varname = "Foo_%02d" % i
globals()[varname]= FooDef("one of several", id_code = i+1, scale_ratio = 2**i)
Dies entspricht dem Ausschreiben
Foo_00 = FooDef("one of several", id_code = 1, scale_ratio=1)
Foo_01 = FooDef("one of several", id_code = 2, scale_ratio=2)
Foo_02 = FooDef("one of several", id_code = 3, scale_ratio=4)
... 17 more ...
Ein Beispiel für ein Paket, das seine Eingabe durch Sammeln einer Reihe von Definitionen aus einem Python-Modul erhält, ist PLY (Python-lex-yacc) http://www.dabeaz.com/ply/ - in diesem Fall sind die Objekte meistens funktionsfähig Objekte, aber auch Metadaten aus den Funktionsobjekten (deren Namen, Dokumentzeichenfolgen und Definitionsreihenfolge) sind Teil der Eingabe. Es ist kein so gutes Beispiel für die Verwendung von globals()
. Außerdem wird es von der 'Konfiguration' importiert - letztere ist ein normales Python-Skript - und nicht umgekehrt.
Ich habe 'deklaratives Python' für einige Projekte verwendet, an denen ich gearbeitet habe, und hatte Gelegenheit, globals()
Konfigurationen für diese zu schreiben. Man könnte sicherlich argumentieren, dass dies auf eine Schwäche in der Art und Weise zurückzuführen ist, wie die Konfigurationssprache entworfen wurde. Gebrauch vonglobals()
auf diese Weise führt nicht zu sehr klaren Ergebnissen. Nur Ergebnisse, die möglicherweise einfacher zu pflegen sind als ein Dutzend nahezu identischer Aussagen.
Sie können es auch verwenden, um Variablen innerhalb der Konfigurationsdatei entsprechend ihren Namen eine Bedeutung zu geben:
foo_k = [ v for k,v in globals().items() if k.startswith('Foo_k_')]
Bar_klist = BarDef( foo_k , method = "kset")
Diese Methode kann für jedes Python-Modul nützlich sein , das viele Tabellen und Strukturen definiert, um das Hinzufügen von Elementen zu den Daten zu vereinfachen, ohne dass auch die Referenzen gepflegt werden müssen.