Загрузите внешний файл .json и объедините его со структурированной конфигурацией гидры.Python

Программы на Python
Anonymous
Загрузите внешний файл .json и объедините его со структурированной конфигурацией гидры.

Сообщение Anonymous »

Я создаю несколько скриптов с использованием Python и хочу использовать Hydra (https://hydra.cc/). Я следую структурированному шаблону конфигурации, где у меня есть config.py и config.yaml в каталоге conf, и я проверяю свою конфигурацию с помощью классов данных, например:

Код: Выделить всё

#### config.yaml

visualisation_conf:
degradation:
data_path: /measurements
input_data_formats: .csv

#### config.py

@dataclass
class VisualisationConfig:
degradation: DegradationConfig

@dataclass
class DegradationConfig:
data_path: str
input_data_formats: str

@dataclass
class MainHydraConfig:
visualisation_conf: VisualisationConfig

#### Usage in script:
import hydra
from conf.config import MainHydraConfig

@hydra.main(version_base=None, config_path="../conf", config_name="config")
def main(base_cfg: MainHydraConfig):
input_type = base_cfg.visualisation_conf.degradation.input_data_formats
...
Это работало нормально, пока мне не пришлось загрузить файл JSON и добавить его в свою конфигурацию. У меня есть внешний файл json (называемый «schema.json» и расположенный в каталоге conf), который я хотел бы загрузить во время выполнения и объединить с моей основной конфигурацией. Я пробовал что-то вроде этого:

Код: Выделить всё

#### config.yaml

dataset_schema:
schema_path: ${hydra:runtime.cwd}/conf/schema.json
schema: ...

#### config.py

@dataclass
class JSONSchemaConfig:
schema_path: str
schema: dict = field(default_factory=dict)

def load_schema(self):
if os.path.exists(self.schema_path):
with open(self.schema_path, "r") as f:
self.schema = json.load(f)

@dataclass
class MainHydraConfig:
json_schema: JSONSchemaConfig = field(default_factory=JSONSchemaConfig)

def __post__init__(self):
self.json_schema.load_schema()
merged_conf = OmegaConf.create(self.json_schema.schema)
OmegaConf.merge(self, merged_conf)
однако во время выполнения ничего не загружается, поскольку __post_init__ не вызывается. Возможно ли то, чего я хочу достичь, в OmegaConf/Hydra? Может быть, мне стоит попробовать другой подход для достижения моей конечной цели, а именно загрузить файл JSON как dict и объединить его с остальной частью конфигурации? Я знаю, что могу перенести логику, связанную с загрузкой этого json, в сам скрипт, но я почти уверен, что мне просто не хватает некоторых мелких деталей, которые мешают этому работать должным образом.

Подробнее здесь: https://stackoverflow.com/questions/787 ... dra-config

Вернуться в «Python»