In Python ist das JSON-Modul im Paket enthalten, das Yaml-Modul wird jedoch von einem Drittanbieter erstellt. In dem Programm schreibe ich gerade, um den Unterschied in der Umgebung zu absorbieren
Das Verhalten wird übernommen. Da yaml und json ähnliche Schnittstellen haben, habe ich sie genauso behandelt wie unten.
try:
import yaml
with open("config.yaml") as y:
config = yaml.load("config.yaml")
except ImportError:
import json
try:
with open("config.json") as j:
config = json.load(j)
except AttributeError:
logger.error("please set config file in json or yaml !!")
raise
#Verwenden Sie den Wert von config unten ...
Hier gab es eine Falle. Im Fall von yaml wird der Schlüsseltyp automatisch erraten und gelesen, aber json ist immer "str". Mit anderen Worten, wenn die Konfigurationsdatei den folgenden Inhalt hat
config.yaml
1: "hoge"
key: "fuga"
config.json
{
"1": "hoge",
"key": "fuga"
}
In beiden Fällen können Sie mit config ["key"] auf "fuga" zugreifen, für "hoge" jedoch "config [" 1 "]" für json und "config [" für yaml. Muss mit 1] `zugegriffen werden.
Um dies zu vermeiden, geben Sie eine Funktion als Hook bei json.load ()
an.
def jsonkeys_to_int_always(x): #Wenn Sie alle Schlüsseltypen auf int setzen können, klicken Sie hier.
if isinstance(x, dict):
return {int(k):v for k,v in x.items()}
return x
def jsonkey_to_int_when_possible(x): #Klicken Sie hier, wenn Sie sich wie Yaml verhalten möchten
d = {}
if isinstance(x, dict):
for k,v in x.items():
try:
k = int(k)
except ValueError:
pass
d[k] = v
return d
config = json.load("config.json", object_hook=jsonkeys_to_int_when_possible)
Es scheint, dass Sie den Unterschied durch Geben Sie den Wert in yaml an absorbieren können, aber ich kenne die Details nicht.
Recommended Posts