Laden Sie JSON-Typen dynamisch mit Python

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

  1. Wenn Sie ein Yaml-Modul und eine Yaml-Konfigurationsdatei haben, lesen Sie diese.
  2. Wenn es nicht funktioniert, lesen Sie mit json.
  3. Wenn das nicht funktioniert, geben Sie eine Ausnahme

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

Laden Sie JSON-Typen dynamisch mit Python
Umgang mit Json in Python
Einfaches Formatieren von JSON mit Python
Importieren Sie Skripte dynamisch in Python
Rufen Sie Methoden in Python dynamisch auf
Umgang mit JSON-Dateien in Python
Typ in Python angegeben. Ausnahmen auslösen
Python #JSON
Definieren Sie Funktionen (Methoden) in Python dynamisch
Laden Sie das Remote-Python-SDK mit IntelliJ
[Python3] Definieren Sie globale Variablen in einer Funktion dynamisch
Dateneingabe / -ausgabe in Python (CSV, JSON)
Dynamisches Definieren von Variablen in Python
Geben Sie Anmerkungen für Python2 in Stub-Dateien ein!
Lesen und schreiben Sie JSON-Dateien mit Python
So füllen Sie mit Python dynamisch Nullen aus
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Geokodierung in Python
SendKeys in Python
Numerischer Python-Typ
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Python2-Zeichenfolgentyp
Konstante in Python
Python # String-Typ
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken