【问题标题】:Python YAML dumping pointer references [duplicate]Python YAML转储指针引用[重复]
【发布时间】:2018-07-10 19:34:07
【问题描述】:

我正在尝试使用几个组件模板构建 YAML 文档。我正在加载它们,构建一个 Python 对象,然后尝试转储它们(最终到一个文件,但这个例子只是打印)。正如您在下面看到的,它打印的是引用和指针,而不是我期望的字符串数据。我在做什么错(或没有​​做什么)?

这是我为演示我的问题而制作的一个示例:

import yaml

main_template = yaml.load('organization: main')

sub_template = yaml.load('''
division: development
other:
  data:
  - for: users
''')

users = [ 'alice', 'bob', 'kim' ]

all_user_data = dict(main_template)

user_list = []

for user in users:
    tmp = dict(sub_template)
    tmp['name'] = user
    user_list.append(tmp)

all_user_data['users'] = user_list
print(yaml.dump(all_user_data, default_flow_style=False))

这会产生:

organization: main
users:
- division: development
  name: alice
  other: &id001
    data:
    - for: users
- division: development
  name: bob
  other: *id001
- division: development
  name: kim
  other: *id001

我期待这样的输出:

organization: main
users:
- division: development
  name: alice
  other:
    data:
    - for: users
- division: development
  name: bob
  other:
    data:
    - for: users
- division: development
  name: kim
  other:
    data:
    - for: users

【问题讨论】:

    标签: python string pointers yaml


    【解决方案1】:

    正如 Anthon 在 Avoid references in PyYAML 中建议的那样,您可以这样做

    yaml.Dumper.ignore_aliases = lambda *args : True
    

    那么,

    print(yaml.dump(all_user_data, default_flow_style=False))
    

    产量

    organization: main
    users:
    - division: development
      name: alice
      other:
        data:
        - for: users
    - division: development
      name: bob
      other:
        data:
        - for: users
    - division: development
      name: kim
      other:
        data:
        - for: users
    

    我不知道为什么会这样。向 Anthon 致敬。

    奥利弗

    【讨论】:

    • 它的工作原理是通过始终返回 True 来替换检查是否不需要找到别名的方法。因此不会搜索别名,并且每个对象都按原样转储。这当然很危险:如果您的数据结构中存在循环,您的 YAML 文件将变得无限大。表明问题已在 Stack Overflow 上得到回答的首选方式是将其作为重复项关闭(或根据您的声誉级别,建议关闭它)
    • 感谢Anthon的解释和建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2019-01-16
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多