Форматирование yaml для включения вложенного словаря? - PullRequest
0 голосов
/ 16 января 2020

Извините, если это глупый вопрос, я очень плохо знаком с конфигурациями yaml (+ конфигурации в целом), и все немного сбивает с толку. У меня есть файл, который выглядит так:

hosts:
  - hostid: 43842
    tag: "name"
    items:
      port: "some port"
      in: 2342124
      out: 2349334
  - hostid: 24586
    tag: "..."

И так далее. Эта конфигурация работает с моим проектом (выполненным в python), но я хотел бы добавить еще несколько значений порта в разделе «items» и иметь их собственные координаты входа / выхода. Я не могу найти правильный формат для этого. Какие есть способы подойти к этому? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Вы можете иметь список объектов внутри предметов. Несколько портов.

hosts:
  - hostid: 43842
    tag: "name"
    items:
      - port: "some port"
        in: 2342124
        out: 2349334
      - port: "some other port"
        in: 2342124
        out: 2349334

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

hosts:
  - hostid: 43842
    tag: "name"
    items:
      port: "some port"
      data:
        - in: 2342124
          out: 2349334
        - in: 2342124
          out: 2349334
0 голосов
/ 16 января 2020

Похоже, items - это тип dict, означающий, что у вас не может быть одинаковых ключей или вы перезаписываете значения снова и снова. Что вам нужно, это list из dict с.

Мы могли бы использовать pyyaml (pip install pyyaml), чтобы выполнить sh это. Вот пример

import yaml

contents = """
hosts:
  - hostid: 43842
    tag: "name"
    items:
      port: "some port"
      in: 2342124
      out: 2349334"""

# cook the data a little to make items a list instead of a dict
data = yaml.full_load(contents)
for d in data.get('hosts'):
    d['items'] = [d.get('items')]

# modify whatever we are interested in
for host in data.get('hosts'):
    if host.get('hostid') == 43842:
        host['items'].append({
            'port': 'another port',
            'in': 12345,
            'out': 12345
        })

# show our modifications
print(yaml.dump(data))

Это печатает:

hosts:
- hostid: 43842
  items:
  - in: 2342124
    out: 2349334
    port: some port
  - in: 12345
    out: 12345
    port: another port
  tag: name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...