In python 3.7 dataclasses module was introduced for faster class creation (PEP 557).
Unfortunately, there's no support for __slots__
(basic support was added in 3.10). If you want to create more memory
efficient instances, you need to do it by yourself or use @dataslots
decorator.
@dataslots
@dataclass
class Point2D:
x: int
y: int
As described in docs, in derived class __dict__
is created, because base class does not have __slots__
.
Slots are created from all defined properties (returned by dataclasses.fields()
function).
@dataclass
class Base:
a: int
@dataslots
@dataclass
class Derived(Base):
c: int
d: int
@dataslots(add_dict=True)
@dataclass
class Point2D:
x: int
y: int
point = Point2D(10, 20)
point.length = math.sqrt(point.x ** 2 + point.y ** 2)
@dataslots(add_weakref=True)
@dataclass
class Point2D:
x: int
y: int
point = Point2D(10, 20)
r = weakref.ref(point)
With __slots__
it's possible to define read-only class variables. When using dataclasses you cannot provide type
for attribute or use typing.ClassVar
to declare one.
@dataslots
@dataclass
class A:
x = 5
y: ClassVar[set] = set()
Because of an issue 36424 you need custom __setstate__
method. In dataslots
there is implemented default version, and it is used if decorated class has no __getstate__
and __setstate__
function declared.
Added in 1.0.2
Data descriptors are supported by
inheritance from DataDescriptor
(base class with required interface) or DataslotsDescriptor
(class with
additional features to simplify descriptor definition).
Check example directory for basic usage.
Added in 1.1.0
The package is PEP 561 compliant, so you can easily use it with mypy>=1.1.1
1 and pyright
.
1 Due to some issues in mypy not all features are supported correctly (known bugs: descriptors).
Added in 1.2.0
If you prefer using the newest dataclasses.dataclass
interface you can use dataslots.dataclass
wrapper
to provide a consistent interface regardless of the python version.
Notice: Wrapper always uses dataslots
to make all additional features available and slots=True
is obligatory.
Added in 1.2.0
All packages from version 1.2.0 can be verified using SLSA provenance (dataslots package is compliant with SLSA Level 3).
If you want to verify dataslots before installing, you need to download SLSA verifier and run:
slsa-verifier verify-artifact \
--provenance-path dataslots.intoto.jsonl \
--source-uri github.com/starhel/dataslots \
--source-tag v${VER} \
${PATH_TO_PACKAGE}
VER
is version of package download from PYPI or GH release. Provenance is only available in GH release as PYPI
does not accept jsonl files.