marcy-terui/lamvery

lamvery/config Crashes Constructor of yaml `'tag:yaml.org,2002:merge'` ?

Opened this issue · 2 comments

Here is the code to reproduce.

# Ref: https://github.com/marcy-terui/lamvery/blob/master/lamvery/config.py#L28-L30
import yaml

y = """
def: &default
  foo: bar

pro:
  <<: *default
"""

yaml.load(y)

#=> {'def': {'foo': 'bar'}, 'pro': {'foo': 'bar'}}


from collections import OrderedDict
yaml.add_constructor(
    yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
    lambda loader, node: OrderedDict(loader.construct_pairs(node)))

yaml.load(y)
# => ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:merge'
  in "<string>", line 6, column 3:
      <<: *default
      ^

サンプルのdice_constructorだとこう言うコケ方にならない、なんでだろう?

http://pyyaml.org/wiki/PyYAMLDocumentation#Constructorsrepresentersresolvers

根深そうな問題ですね・・・。順番を保持するためにYAMLでOrderdDictを扱うために入っているコードなんですが、yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG == tag:yaml.org,2002:map なので、tag:yaml.org,2002:merge を足してみたりしたら別のエラーになったり・・・wちょっと調査と試行錯誤が必要そうです。。。