Charger dynamiquement les types json avec python

En python, le module json est inclus dans le package, mais le module yaml est créé par un tiers. Dans le programme que j'écris actuellement, pour absorber la différence dans l'environnement

  1. Si vous avez un module yaml et que vous avez un fichier de configuration yaml, lisez-le.
  2. Si cela ne fonctionne pas, essayez de lire avec json.
  3. Si cela ne fonctionne pas, donnez une exception

Le comportement est adopté. Étant donné que yaml et json ont des interfaces similaires, je les ai traités exactement de la même manière que ci-dessous.

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


#Utilisez la valeur de config ci-dessous ...

Il y avait un piège ici. Dans le cas de yaml, le type de clé est automatiquement deviné et lu, mais json est toujours str. En d'autres termes, si le fichier de configuration a le contenu suivant

config.yaml


1: "hoge"
key: "fuga" 

config.json


{
    "1": "hoge",
    "key": "fuga"
}

Dans les deux cas, vous pouvez accéder à " fuga " avecconfig ["key"], mais" hoge "ʻis config [" 1 "] pour json et config ["pour yaml Doit être accédé avec 1] `.

Pour éviter cela, donnez une fonction comme hook à json.load ().

def jsonkeys_to_int_always(x): #Si vous pouvez définir tous les types de clés sur int, cliquez ici.
    if isinstance(x, dict):
            return {int(k):v for k,v in x.items()}
    return x

def jsonkey_to_int_when_possible(x): #Cliquez ici si vous souhaitez vous comporter de la même manière que yaml
    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)

Il semble que vous puissiez absorber la différence en Spécifiez la valeur en yaml, mais je ne connais pas les détails.

Recommended Posts

Charger dynamiquement les types json avec python
Manipulation de json en python
Formatez facilement JSON avec Python
Importer dynamiquement des scripts en Python
Appeler dynamiquement des méthodes en Python
Gestion des fichiers JSON en Python
Type spécifié en python. Lancer des exceptions
Python #JSON
Définir dynamiquement des fonctions (méthodes) en Python
Charger le SDK Python distant avec IntelliJ
[Python3] Définir dynamiquement des variables globales dans une fonction
Entrée / sortie de données en Python (CSV, JSON)
Comment définir dynamiquement des variables en Python
Tapez les annotations pour Python2 dans les fichiers stub!
Lire et écrire des fichiers JSON avec Python
Comment remplir dynamiquement des zéros avec Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Type numérique Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Type de chaîne Python2
Constante en Python
Python # type de chaîne
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python