Разберите YAML и предположим, что определенный путь всегда является строкой

Я использую парсер YAML с http://pyyaml.org, и я хочу, чтобы он всегда интерпретировал определенные поля как строку, но я не могу понять, как работает add_path_resolver ().

Например: Парсер предполагает, что «версия» – это float:

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

Некоторые файлы имеют «версию: 2» (которая интерпретируется как int) или «version: 2.3 alpha» (которая интерпретируется как str).

Я хочу, чтобы они всегда интерпретировались как str.

Кажется, что yaml.add_path_resolver () должен дать мне указание: «Когда вы видите версию :, всегда интерпретируете ее как str), но она не документирована очень хорошо. Мое лучшее предположение:

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

Но это не работает.

Предложения о том, как заставить мое поле версии всегда быть строкой?

PS Вот несколько примеров различных строк «версии» и их интерпретации:

 (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'} 

2 Solutions collect form web for “Разберите YAML и предположим, что определенный путь всегда является строкой”

На сегодняшний день самым простым решением для этого является не использование базового .load() (который в любом случае небезопасен), но использовать его с Loader=BaseLoader , который загружает каждый скаляр в виде строки:

 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) 

дает:

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

Из текущего источника:

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

Похоже, что он не завершен (пока?). Синтаксис, который будет работать (насколько я могу судить):

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

Однако это не так.

По-видимому, сначала проверяются имплицированные импликации типов, и если они совпадают, то он никогда не проверяет определяемые пользователем преобразователи. Подробнее см. В файле resolver.py (найдите решение функции).

Я предлагаю изменить вашу запись в version

 version: !!str 2.3 

Это всегда будет принуждать его к строке.

  • Как я могу проанализировать YAML-файл в Python
  • Есть ли выигрыш в производительности от определения маршрутов в app.yaml по сравнению с одним большим отображением в WSGIApplication в AppEngine?
  • Ошибки pyYAML в строке «!» в строке
  • Получение ученого представления данных из неконтролируемого обучения в pylearn2
  • В чем заключается основное различие между pickle и yaml в Python?
  • Параметры конструктора по умолчанию в pyyaml
  • YAML-файл url и скрипт в GAE python
  • Разбор файла YAML в Python и доступ к данным?
  • Python - лучший язык программирования в мире.