14

まず、免責事項:私はYAMLにあまり精通していません。YAMLドキュメントをキーと値のペアに解析しようとしています(どのように実行するかについて心配する必要はありません。そのビットを処理しました)

私のファイルは以前は次のようになりました。

world:
     people:
          name:Suzy
          address:chez-bob

それから、誰かが行ってそれを変えました。

world:
     people:
          name:!$uzy
          address:chez-bob

そして、私はこの解析エラーを受け取ります:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!$uzy'

これはどういう意味ですか?!$を2文字として解釈するにはどうすればよいですか?文字列のキーと値の辞書が欲しいだけです!また、yamlファイルを編集することはできません。問題は、パーサーを使用してコードで修正する必要があります。

4

3 に答える 3

16

感嘆符はYAMLタグのプレフィックスです。パーサーは、タグ名でコンストラクターを実装する必要があります。!!bool、などのデフォルトのタグがいくつかあり!!int、。のようなPython固有のタグもあります!!python/tuple

独自のコンストラクターを定義でき、プレフィックスによってキャッチされた複数のタグのコンストラクターも定義できます。のプレフィックスを定義することにより、''すべてのタグをキャッチして無視することができます。タグとその値をコンストラクターから返して、すべてをテキストとして扱うことができます。

>>> import yaml
>>> def default_ctor(loader, tag_suffix, node):
...     print loader
...     print tag_suffix
...     print node
...     return tag_suffix + ' ' + node.value
...
>>> yaml.add_multi_constructor('', default_ctor)
>>> yaml.load(y)
<yaml.loader.Loader object at 0xb76ce8ec>
!$uzy
ScalarNode(tag=u'!$uzy', value=u'')
{'world': {'people': {'name': '!$uzy', 'address': 'chez-bob'}}}
>>>
于 2012-11-08T01:49:37.610 に答える
6

値が「!」で始まる場合は、値を一重引用符または二重引用符で囲む必要があります。それ以外の場合は、YAMLタグとして解釈されます。

world:
     people:
          name: "!$uzy"
          address: chez-bob
于 2012-11-08T04:24:12.663 に答える
3

これは実際にはPyYAMLのバグです。:inをキー/値の区切り文字として解釈しますが、その後にスペースが続く場合、または前のスカラー()が引用符で囲まれname:!$uzyている場合にのみ解釈する必要があります。フォローアップエラーは、スカラーの途中で許可されるべき感嘆符が、スカラーの先頭にあると誤って解釈され、タグが導入されることです。:name

keyの値peopleは文字列であり、他のパーサー(私が作成者であるname:!$uzy address:chez-bobPythonパッケージを含む)で正しく処理されます。ruamel.yaml

于 2017-03-14T12:20:28.863 に答える