2016-10-15 7 views
0

Ich möchte Einstellungen aus einer YAML-Datei importieren, sie jedoch als reguläre Variablen im aktuellen Kontext verfügbar machen.Einstellungen aus der Datei importieren

zum Beispiel kann ich eine Datei haben:

param1: 12345 

param2: test11 

param3: 
    a: 4 
    b: 7 
    c: 9 

Und ich möchte Variablen haben param1, param2, param3 in meinem Code.

Ich möchte dies aus jeder Funktion verwenden und möchte nicht, dass sie global verfügbar sind.

Ich habe von locals() und globals() Functuons gehört, aber nicht bekommen, wie man sie dafür verwendet.

Antwort

0

Sie können locals()['newvarname'] = 12345 verwenden, um eine neue Variable zu erstellen. Und Sie können einfach Ihre Datei lesen und diese Struktur ausfüllen, wie Sie möchten.

Sie können eine Funktion schreiben Sie es und Importeinstellungen zu nennen:

import sys 
import yaml 


def get_settings(filename): 
    flocals = sys._getframe().f_back.f_locals # get locals() from caller 
    with open(filename, 'r') as ysfile: 
     ydata = yaml.load(ysfile.read()) 
    for pname in ydata: 
     # assume the yaml file contains dict 
     flocals[pname] = ydata[pname] # merge caller's locals with new vars 
+3

Würde '' update() 'nicht dasselbe erreichen wie Ihre for-Schleife? – spectras

+0

Guter Punkt, im Allgemeinen - ja. Aber ich habe mehr Code in meinem Projekt, wo ich auch mit Unterschlüsseln umgehen, kopierte einfach die Funktion aus Quellen und schneide es. – baldr

0

Auch wenn der Trick in Antwort des @ Baldur groß ist, schlage ich aus der Funktion zur besseren Lesbarkeit der variablen Zuweisungen bewegen. Wenn eine Funktion den Kontext ihres Aufrufers ändert, ist es sehr schwer sich daran zu erinnern und zu pflegen. So,

import yaml 

def get_settings(filename): 
    with open(filename, 'r') as yf: 
     return yaml.load(yf.read()) 

def somewhere(): 
    locals().update(get_settings('foo.yaml')) 
    print(param1) 

Selbst dann würde ich stark vorschlagen, einfach das Wörterbuch zu verwenden. Sonst riskierst du sehr seltsame Bugs. Zum Beispiel, was ist, wenn Ihre YAML-Datei einen open oder einen print Schlüssel enthält? Sie werden die Python-Funktionen überschreiben, so dass die print(param1) im Beispiel eine TypeError Ausnahme auslösen wird.

Verwandte Themen