py.lib
py.lib/config_parse_helper.py
+ Возможность обработки параметров конфигурации перед добавлением в класс конфигурации . Переформатирование части кода по PEP
1.1 --- a/config_parse_helper.py Sat Aug 13 20:06:47 2022 +0300 1.2 +++ b/config_parse_helper.py Sun Aug 14 12:19:08 2022 +0300 1.3 @@ -1,7 +1,7 @@ 1.4 # coding: utf-8 1.5 from configparser import ConfigParser 1.6 from dataclasses import is_dataclass, fields, Field, MISSING 1.7 -from typing import Iterable, Optional, Dict, Any, List 1.8 +from typing import Iterable, Optional, Dict, Any, List, Callable 1.9 from threading import RLock 1.10 from os import getenv 1.11 1.12 @@ -99,11 +99,14 @@ 1.13 self.ph = parser_helper_object 1.14 self.params = {} 1.15 1.16 - def _add_param(self, param_name: str, param_val: Any): 1.17 + def _add_param(self, param_name: str, param_val: Any, parser: Optional[Callable[[Any], Any]] = None): 1.18 """\ 1.19 Непосредственное добавление полученного параметра со всеми проверками. 1.20 """ 1.21 1.22 + if parser is not None and param_val is not None: 1.23 + param_val = parser(param_val) 1.24 + 1.25 fld = self.ph.fields.get(param_name) 1.26 if not isinstance(fld, Field): 1.27 raise ConfigParseHelperError(f'В классе данных отсутствует свойство "{param_name}", ' 1.28 @@ -138,7 +141,7 @@ 1.29 if exc_type is None: 1.30 self.ph.add_params(self.params) 1.31 1.32 - def get(self, config_prop_name: str, dc_prop_name: str): 1.33 + def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None): 1.34 raise NoSectionNotification() 1.35 1.36 1.37 @@ -152,13 +155,14 @@ 1.38 self.section_name = section 1.39 self.section = parser_helper_object.conf_parser[section] 1.40 1.41 - def get(self, config_prop_name: str, dc_prop_name: str): 1.42 + def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None): 1.43 """\ 1.44 :param config_prop_name: Имя опции в файле конфигурации 1.45 :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию 1.46 + :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию 1.47 """ 1.48 try: 1.49 - self._add_param(dc_prop_name, self.section.get(config_prop_name)) 1.50 + self._add_param(dc_prop_name, self.section.get(config_prop_name), parser) 1.51 1.52 except ConfigParseHelperError as e: 1.53 raise ConfigParseHelperError(f'Ошибка при разборе параметра "{config_prop_name}" ' 1.54 @@ -170,14 +174,15 @@ 1.55 Класс для разбора переменных окружения в том же ключе, что и файла конфигурации 1.56 """ 1.57 1.58 - def get(self, env_name: str, dc_prop_name: str): 1.59 + def get(self, env_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None): 1.60 """\ 1.61 :param env_name: Имя переменной окружения, хранящей опцию 1.62 :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию 1.63 + :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию 1.64 """ 1.65 1.66 try: 1.67 - self._add_param(dc_prop_name, getenv(env_name)) 1.68 + self._add_param(dc_prop_name, getenv(env_name), parser) 1.69 1.70 except ConfigParseHelperError as e: 1.71 raise ConfigParseHelperError(f'Ошибка при получении значения из переменной окружения "{env_name}": {e}') 1.72 @@ -208,23 +213,24 @@ 1.73 raise ConfigParseHelperError(f'Ошибка создания объекта объекта конфигурации, ' 1.74 f'списка объектов конфигурации: {e}') 1.75 1.76 - def get(self, config_prop_name: str, dc_prop_name: str): 1.77 + def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None): 1.78 """\ 1.79 Подготавливаем список соответствия названий параметров в секции конкретным свойствам данного 1.80 в помощник класса 1.81 1.82 :param config_prop_name: Имя опции в файле конфигурации 1.83 :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию 1.84 + :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию 1.85 """ 1.86 1.87 - self.ident_list.append((config_prop_name, dc_prop_name)) 1.88 + self.ident_list.append((config_prop_name, dc_prop_name, parser)) 1.89 1.90 def get_config_objects(self) -> List[object]: 1.91 for section in self.sections: 1.92 try: 1.93 with CPHSection(self, section) as section_helper: 1.94 - for conf_prop, dc_prop in self.ident_list: 1.95 - section_helper.get(conf_prop, dc_prop) 1.96 + for conf_prop, dc_prop, parser in self.ident_list: 1.97 + section_helper.get(conf_prop, dc_prop, parser) 1.98 1.99 except ConfigParseHelperError as e: 1.100 raise ConfigParseHelperError(f'Ошибка при разборе секции "{section}": {e}')