Файл конфигурации YAML с объектом класса - PullRequest
1 голос
/ 05 мая 2020

У меня есть файл конфигурации yaml (configuration.yaml).

Который я загружаю, используя:

import yaml

configuration = load_configurations()
def load_configurations(path_configuration = "../input/configuration.yaml"):
    with open(path_configuration, "r") as stream:
        try:
            return(yaml.safe_load(stream))
        except yaml.YAMLError as exc:
            print(exc)

Внутри configuration У меня следующая структура:

parameters:
   pmt1:
      value: 1.0
      description: some text
   pmt2:
      value: 0.03
      description: some other text
   pmt3:
      value: 0.033
      description: more text
...
...
   pmtN:
      value: 0.04
      description: yet more text

Теперь, Я хотел бы импортировать эти параметры как объекты в класс, значение которого равно value, взятому из файла конфигурации.

Я прочитал YAML документация и следующие ранее заданные вопросы:

Преобразовать вложенный Python dict в объект?

Преобразование словаря в объект с ключами в качестве имени объекта в Python

Но я не смог решить свою проблему.

До сих пор мне удавалось сделать:

class MyClass:

    def __init__(self, configuration):
        self.set_parameters(configuration)


    def set_parameters(self, configuration):
        self.__dict__ = configuration["parameters"]    

Что работает, но позволяет мне вызывать только что-то вроде:

In[]: MyClass.pmt1
Out[]: 
{'value': 1,
 'description': 'some text'}

Что я хотел бы получить:

In[]: MyClass.pmt1
Out[]: 1

Я тоже пробовал для перебора элементов словаря for item in configuration['parameters'].items():, но это возвращает кортеж в форме:

('pmt1', {'value': 1.0, 'description': 'some text'}) 

, но я не уверен, как продолжить отсюда.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Я бы использовал setattr вместо перезаписи __dict__, что могло бы иметь неожиданные последствия.

class MyClass:

    def __init__(self, configuration):
        self.set_parameters(configuration)

    def set_parameters(self, configuration):
        for k, v in configuration["parameters"].items():
            setattr(self, k, v["value"])

Если только не требуется возможность сбросить атрибуты экземпляра, я бы установите их внутри __init__ и избегайте вызова метода:

class MyClass:

    def __init__(self, configuration):
        for k, v in configuration["parameters"].items():
            setattr(self, k, v["value"])
1 голос
/ 05 мая 2020

Я не совсем уверен, что вы хотите делать, поскольку я не знаю, что означает In[] / Out[], и вы не показываете весь свой код, но я думаю, вы ищете что-то вроде

class MyClass:

    def __init__(self, configuration):
        self.set_parameters(configuration)


    def set_parameters(self, configuration):
        self.__dict__ = {k:v.value for (k,v) in configuration["parameters"].items()}
...