import configparser import dataclasses from dataclasses import dataclass from pathlib import Path from typing import Callable from typing import ClassVar from typing import Optional from typing import Union
def _parse_cfg_file(filespec: Union[Path, str]):
cfg = configparser.ConfigParser() try:
filepath = make_path(filespec, check_exists=True) except FileNotFoundError as e: raise MissingConfig(f"No config file found at {filespec}") from e else: with open(filepath, encoding="utf-8") as f:
cfg.read_file(f) return cfg
def _build_getter(cfg_obj, cfg_section, method, converter=None): def caller(option, **kwargs): try:
rv = getattr(cfg_obj, method)(cfg_section, option, **kwargs) except configparser.NoSectionError as nse: raise MissingConfigSection(
f"No config section named {cfg_section}"
) from nse except configparser.NoOptionError as noe: raise MissingConfigItem(f"No config item for {option}") from noe except ValueError as ve: # ConfigParser.getboolean, .getint, .getfloat raise ValueError # on bad types raise ConfigValueTypeError(
f"Wrong value type for {option}"
) from ve else: if converter: try:
rv = converter(rv) except Exception as e: raise ConfigValueTypeError(
f"Wrong value type for {option}"
) from e return rv
return caller
def _build_getter_dispatch(cfg_obj, cfg_section, converters=None):
converters = converters or {}
# use ConfigParser.get and convert value
getters.update(
{
type_: _build_getter(
cfg_obj, cfg_section, "get", converter=converter_fn
) for type_, converter_fn in converters.items()
}
)
return _GetterDispatch(getters, default_getter)
@dataclass class ReadsCfg:
section_header: ClassVar[str]
converters: ClassVar[Optional[dict]] = None
@classmethod def from_cfg_file(cls, filespec: Union[Path, str]):
cfg = _parse_cfg_file(filespec)
dispatch = _build_getter_dispatch(
cfg, cls.section_header, converters=cls.converters
)
kwargs = {
field.name: dispatch.get_typed_value(field.type, field.name) for field in dataclasses.fields(cls)
} return cls(**kwargs)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.