Как разрешить внутренние переменные с Python YAML? - PullRequest
1 голос
/ 24 июня 2019

У меня есть файл test.yml:

---
Servers:
  Server1:
    location: "Earth"
    network: {ip: "0.0.0.0", mac: "00:00:00:00:00:00"}
    inbound: "{{ Configs.Earth.allowed_connections }}"

  Server2:
    location: "Earth"
    network: {ip: "0.0.0.1", mac: "00:00:00:00:00:02"}
    inbound: "{{ Configs.Earth.allowed_connections }}"

  Server3:
    location: "Moon"
    network: {ip: "0.0.0.2", mac: "00:00:00:00:00:02"}

  Server4:
    location: "Mars"
    network: {ip: "0.0.0.3", mac: "00:00:00:00:00:03"}
    inbound: "{{ Configs.Mars.allowed_connections }}"

Configs:
  Earth:
    allowed_connections:
      - 99.99.99.99
      - 99.99.99.98
      - 99.99.99.97

  Mars:
    allowed_connections:
      - 88.99.99.99
      - 88.99.99.98
      - 88.99.99.97

Я бы хотел разрешить переменные inbound при загрузке файла yml с помощью python. Есть ли способ сделать это изначально? Или мне нужно написать функцию, которая ищет любые переменные, содержащие "{{ }}", а затем сбрасывает их.

В решении необходимо учитывать различные глубины, на которых могут располагаться переменные.

У меня нет проблем с загрузкой файла с yaml.load это переменная с разрешением, с которой я борюсь

Ответы [ 3 ]

0 голосов
/ 24 июня 2019

Для этого вы можете использовать якоря / псевдонимы.

Например, для уменьшенной версии вашего примера

>>> import yaml
>>> doc = """
Configs: 
  Mars: 
    allowed_connections: &mars # Mark this as an anchor
      - 88.99.99.99 
      - 88.99.99.98 
      - 88.99.99.97 
Servers: 
  Server: 
    location: "Mars" 
    network: {ip: "0.0.0.3", mac: "00:00:00:00:00:03"} 
    inbound: *mars  # references the anchor here
"""
>>> from pprint import pprint # just for formatting
>>> pprint(yaml.load(doc))
{'Configs': {'Mars': {'allowed_connections': ['88.99.99.99',
                                              '88.99.99.98',
                                              '88.99.99.97']}},
 'Servers': {'Server': {'inbound': ['88.99.99.99',
                                    '88.99.99.98',
                                    '88.99.99.97'],
                        'location': 'Mars',
                        'network': {'ip': '0.0.0.3',
                                    'mac': '00:00:00:00:00:03'}}}}

Обратите внимание, что раздел конфигурации должен быть перед разделом сервера, чтобы онможно ссылаться.

Дополнительные примеры здесь .

0 голосов
/ 24 июня 2019

Вы можете использовать регулярные выражения для вашей функции: ("(.*?)") Он найдет все слова в кавычках. Вам просто нужно проверить, есть ли в строке «Configs.Mars.allowed_connections».

Отметьте этот пример регулярного выражения

0 голосов
/ 24 июня 2019

вы можете использовать шаблонный модуль Jinja здесь, см. Пример ниже:

import yaml
from jinja2 import Environment

jsonobj = yaml.full_load(your_yaml_stream)
print jsonobj
print Environment().from_string(your_yaml_stream).render(jsonobj)

Выходные данные будут:

Servers:
  Server1:
    location: "Earth"
    network: {ip: "0.0.0.0", mac: "00:00:00:00:00:00"}
    inbound: "['99.99.99.99', '99.99.99.98', '99.99.99.97']"

  Server2:
    location: "Earth"
    network: {ip: "0.0.0.1", mac: "00:00:00:00:00:02"}
    inbound: "['99.99.99.99', '99.99.99.98', '99.99.99.97']"

  Server3:
    location: "Moon"
    network: {ip: "0.0.0.2", mac: "00:00:00:00:00:02"}

  Server4:
    location: "Mars"
    network: {ip: "0.0.0.3", mac: "00:00:00:00:00:03"}
    inbound: "['88.99.99.99', '88.99.99.98', '88.99.99.97']"

Configs:
  Earth:
    allowed_connections:
      - 99.99.99.99
      - 99.99.99.98
      - 99.99.99.97

  Mars:
    allowed_connections:
      - 88.99.99.99
      - 88.99.99.98
      - 88.99.99.97
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...