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
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