Bastian Blank - 08 April 2024
Python includes some helping support for classes that are designed to just hold some data and not much more: Data Classes.
It uses plain Python type definitions to specify what you can have and some further information for every field.
This will then generate you some useful methods, like __init__ …
Python includes some helping support for classes that are designed to just hold some data and not much more: Data Classes.
It uses plain Python type definitions to specify what you can have and some further information for every field.
This will then generate you some useful methods, like __init__
and __repr__
, but on request also more.
But given that those type definitions are available to other code, a lot more can be done.
There exists several separate packages to work on data classes. For example you can have data validation from JSON with dacite.
But Debian likes a pretty strange format usually called Deb822, which is in fact derived from the RFC 822 format of e-mail messages. Those files includes single messages with a well known format.
So I'd like to introduce some Deb822 format support for Python Data Classes. For now the code resides in the Debian Cloud tool.
It uses the standard data classes support and several helper functions. Also you need to enable support for postponed evaluation of annotations.
from __future__ import annotations
from dataclasses import dataclass
from dataclasses_deb822 import read_deb822, field_deb822
Data classes are just normal classes, just with a decorator.
@dataclass
class Package:
You need to specify the exact key to be used for this field.
package: str = field_deb822('Package')
version: str = field_deb822('Version')
arch: str = field_deb822('Architecture')
Default values are also supported.
multi_arch: Optional[str] = field_deb822(
'Multi-Arch',
default=None,
)
for p in read_deb822(Package, sys.stdin, ignore_unknown=True):
print(p)
from __future__ import annotations
from dataclasses import dataclass
from debian_cloud_images.utils.dataclasses_deb822 import read_deb822, field_deb822
from typing import Optional
import sys
@dataclass
class Package:
package: str = field_deb822('Package')
version: str = field_deb822('Version')
arch: str = field_deb822('Architecture')
multi_arch: Optional[str] = field_deb822(
'Multi-Arch',
default=None,
)
for p in read_deb822(Package, sys.stdin, ignore_unknown=True):
print(p)