A fully typed configparser for python
Ankit Jain
Posted on January 24, 2024
typed-configparser
typed-configparser is an extension of the standard configparser module with support for typed configurations using dataclasses.
It leverages Python's type hints and dataclasses
to provide a convenient way of parsing and validating configuration files.
Features
✓ Fully typed.
✓ Use dataclasses to parse the configuration file.
✓ Support for almost all python built-in data types - int
, float
, str
, list
, tuple
, dict
and complex data types using Union
and Optional
.
✓ Built on top of configparser
, hence retains all functionalities of configparser
.
✓ Support for optional values (optional values are automatically set to None
if not provided).
✓ Smarter defaults.
Usage
examples/basic.py
# This is a complete example and should work as is
from typing import List
from typed_configparser import ConfigParser
from dataclasses import dataclass
@dataclass
class BASIC:
option1: int
option2: str
option3: float
option4: List[str]
config = """
[BASIC]
option1 = 10
option2 = value2
option3 = 5.2
option4 = [foo,bar]
"""
parser = ConfigParser()
parser.read_string(config)
section = parser.parse_section(using_dataclass=BASIC)
print(section)
BASIC(option1=10, option2=value2, option3=5.2, option4=['foo', 'bar'])
examples/unions_and_optionals.py
# This is a complete example and should work as is
from typing import List, Union, Optional, Dict, Tuple
from typed_configparser import ConfigParser
from dataclasses import dataclass, field
@dataclass
class DEFAULT_EXAMPLE:
option1: int
option2: Union[List[Tuple[str, str]], List[int]]
option3: Dict[str, str] = field(default_factory=lambda: {"default_key": "default_value"})
option4: Optional[float] = None
config = """
[DEFAULT]
option1 = 20
option2 = default_value2
[MY_SECTION_1]
option2 = [10,20]
option4 = 5.2
[MY_SECTION_2]
option2 = [(value2a, value2b), (value2c, value2b), (value2c, value2d)]
option3 = {key: value}
option4 = none
"""
parser = ConfigParser()
parser.read_string(config)
my_section_1 = parser.parse_section(using_dataclass=DEFAULT_EXAMPLE, section_name="MY_SECTION_1")
my_section_2 = parser.parse_section(using_dataclass=DEFAULT_EXAMPLE, section_name="MY_SECTION_2")
print(my_section_1)
print(my_section_2)
DEFAULT_EXAMPLE(option1=20, option2=[10, 20], option3={'default_key': 'default_value'}, option4=5.2)
DEFAULT_EXAMPLE(option1=20, option2=[('value2a', 'value2b'), ('value2c', 'value2b'), ('value2c', 'value2d')], option3={'key': 'value'}, option4=None)
Check the github repo for more details.
Posted on January 24, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.