Question

J'utilise l'analyseur YAML de http://pyyaml.org et je veux toujours interpréter certains domaines comme chaîne, mais je ne peux pas comprendre comment add_path_resolver () fonctionne.

Par exemple: L'analyseur suppose que "version" est un float:

network:
- name: apple
- name: orange
version: 2.3
site: banana

Certains fichiers ont "version 2" (qui est interprété comme un int) ou "Version: 2.3 alpha". (Qui est interprété comme une str)

Je les veux toujours être interprété comme une str.

.

Il semble que yaml.add_path_resolver () devrait me permettre d'indiquer: « Quand vous voyez la version :, toujours interpréter comme une str), mais il est pas très bien documenté Ma meilleure estimation est:

yaml.add_path_resolver(u'!root', ['version'], kind=str)

Mais cela ne fonctionne pas.

Des suggestions sur la façon d'obtenir mon champ de version pour toujours une chaîne?

P.S. Voici quelques exemples de différentes chaînes « version » et comment ils sont interprétés:

(Pdb) import yaml
(Pdb) import pprint
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': 2}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': 2.2999999999999998}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3 alpha\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': '2.3 alpha'}
Était-ce utile?

La solution

De loin la meilleure solution pour ce n'est pas utiliser le .load() de base (qui est de toute façon dangereuse), mais l'utiliser avec Loader=BaseLoader, qui charge tous les scalaires comme une chaîne:

import yaml

yaml_str = """\
network:
- name: apple
- name: orange
version: 2.3
old: 2
site: banana
"""

data = yaml.load(yaml_str, Loader=yaml.BaseLoader)
print(data)

donne:

{'network': [{'name': 'apple'}, {'name': 'orange'}], 'version': '2.3', 'old': '2', 'site': 'banana'}

Autres conseils

De la source de courant:

 # Note: `add_path_resolver` is experimental.  The API could be changed.

Il semble que ce n'est pas complète (encore?). La syntaxe serait travail (pour autant que je peux dire) est:

yaml.add_path_resolver(u'tag:yaml.org,2002:str', ['version'], yaml.ScalarNode)

Cependant, il ne fonctionne pas.

Il semble que les résolveurs de type implicites sont vérifiées en premier, et si l'on matches, il ne vérifie jamais les résolveurs définis par l'utilisateur. Voir resolver.py pour plus de détails (voir la fonction resolve ).

Je suggère de changer votre entrée version à

version: !!str 2.3

Ce sera toujours forcer à une chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top