LINUX.ORG.RU

Python: как описывать схему конфигов?

 ,


0

3

Есть у меня, братцы, скрипт, который кушает себе на вход пригоршню аргументов командной строки с помощью argparse:

parser = argparse.ArgumentParser(description='Simulator proxy example')

parser.add_argument("--baseline", "-bl", type=str2bool, default=False,
                    help="Run baseline scenario (non-fullbuffer, MEDIUM traffic, CORRELATION scheduler)")

parser.add_argument("--config-path", "-cp", type=str, default=None,
                    help="Path to MATLAB .m config file for UNN SLS")
parser.add_argument("--dump-path", "-dp", type=str, default=None,
                    help="Explicitly sets path to dump folder (value from .m config will be read otherwise)")

parser.add_argument('--fullbuffer', '-fb', type=str2bool, default=True,
                    help="Use fullbuffer traffic mode")
parser.add_argument("--parallel-scheduling", "-ps", type=str2bool, default=False,
                    help="Run scheduling for each of 3 sectors in parallel process")

Всё бы хорошо: и значения-по-умолчанию прописать можно, и типы данных, ну и указать какие аргументы надо явно задавать. Одно западло: это предназначено именно для работы с аргументами командной строки.

А я хочу отрефакторить код моего скрипта, вынеся его в отдельную функцию. Которую вызывать себе из основного Python-процесса (в идеале, безо всяких лишних костылей вроде os.subprocess). И для этого мне бы не помешал аналогичный класс, только для описания конфигов. Чтобы я мог из своего питоньего кода поставить аргументы какие нужны.

Нужно, что-то в таком же духе, как в SqlAlchemy поля в таблице описывают:

class SimulatorConfig(BaseConfig):
    random_seed = Column(Integer, default=33, help="Random seed for simulation")
    matlab_config_path = Column(String, short_name="cp", default=None, help="Path to MATLAB config file for MATLAB part of simulation")
    ...

Из этого потом можно хоть argparse сгенерить, хоть ещё чего. Хоть непосредственно в коде прописать нужные поля – и радоваться жизни.

Можно самому склепать подобное, только это надо метаклассы осиливать, заморачиваться, и вообще велосипедизмом заниматься.



Последнее исправление: Yak (всего исправлений: 1)
Ответ на: комментарий от provaton

Ну, мне было бы ловчее подавать моей функции не жменю отдельных аргументов, а один объект SimulationConfig, у которого объекта в атрибутах были бы те самые аргументы.

Yak
() автор топика
Ответ на: комментарий от anonymous

Тогда уж https://pydantic-docs.helpmanual.io/usage/settings/ - в отличие от 1001 подобных велосипедов, оно с mypy дружит, и автодополнение в IDE работает как надо.

Также есть https://typer.tiangolo.com/ на основое pydantic и click.

Жаль, что pydantic settings и CLI пока никто не догадался подружить. Я бы для себя сам навелосипедил, но давно уже не парюсь и тупо юзаю переменные окружения + .env для конфигурации. Мне норм.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.