4

http://pyyaml.orgのYAMLパーサーを使用していて、特定のフィールドを常に文字列として解釈したいのですが、add_path_resolver()がどのように機能するか理解できません。

例:パーサーは、「バージョン」がフロートであると想定します。

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

一部のファイルには、「バージョン:2」(intとして解釈される)または「バージョン:2.3 alpha」(strとして解釈される)があります。

常にstrとして解釈してほしい。

yaml.add_path_resolver()で、「version:が表示されたら、常に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'}
4

2 に答える 2

2

現在のソースから:

 # 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を参照してください(関数を探してくださいresolve)。

versionエントリをに変更することをお勧めします

version: !!str 2.3

これは常にそれを文字列に強制します。

于 2010-11-11T03:31:42.833 に答える
1

これに対する最も簡単な解決策は、基本.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'}
于 2017-08-15T15:07:36.940 に答える