Properties for dataclass fields
Project description
field-properties
Properties for dataclass fields
Example
from dataclasses import dataclass
from field_properties import field_property, unwrap_property
@dataclass(frozen=True)
class Foo:
bar: int = field_property(default=0) # Same parameter than dataclasses.field
@field_property(bar) # Equivalent to @field_property(bar).getter
def get_bar(self) -> int:
# unwrap_property(self).bar is equivalent to self._bar
# but it's type-checked and linter-friendly
return unwrap_property(self).bar
# When not declared, getter, setter and deleter are generated like the following:
# @field_property(bar).setter
# def set_bar(self, value: int):
# unwrap_property(self).bar = value
assert repr(Foo()) == repr(Foo(0)) == "Foo(bar=0)"
How does it works?
When a dataclass field has a default value, this value is assigned as a class attribute. field_property
use this mechanism and create a field with a property as default value.
If a default value/factory is registered with field_property
, the property setter will be called with it in __init__
.
Default getter/setter/deleter
field_property
generates default getter/setter/deleter as simple wrappers around an instance attribute whose name is the field name prefixed with an underscore _
. unwrap_property
allows accessing this attribute in a type-checked/linter-friendly way.
By the way, if all the getter/setter/deleter are declared (and thus not generated), the protected attribute will not be created.
Overriding
Field properties can be overridden, but the dataclass field must be overridden too — this is because a new field must be created, as property is declared as its default value (see previous section).
from dataclasses import dataclass
from field_properties import field_property, unwrap_property
@dataclass
class Foo:
bar: int = field_property(default=0)
@field_property(bar)
def get_bar(self):
return unwrap_property(self).bar + 1
class Foo2(Foo):
bar: int = field_property(default=0) # field property must be overridden
# field_property(inherit=True) is a shortcut to override a field
# and reusing all it's arguments
@field_property(bar)
def get_bar(self):
return unwrap_property(self).bar + 2
assert Foo() == 1
assert Foo2() == 2
In fact, because field is redeclared, it's also possible to override normal fields with a field property
from dataclasses import dataclass
from field_properties import field_property
@dataclass
class Foo:
bar: int = 0
class Foo2(Foo):
bar: int = field_property(default=1)
assert Foo2() == 1
Raw property
field_property
comes with a default implementation for its getter/setter/deleter. This can be turned off with raw=False
parameter. Here is an example of a read_only field:
from dataclasses import dataclass
from field_properties import field_property
@dataclass
class Foo:
bar: int = field_property(init=False, raw=True)
@field_property(bar)
def get_bar(self) -> int:
return 0
assert Foo().bar == 0
assert str(Foo()) == "Foo(bar=0)"
try:
Foo().bar = 1
except AttributeError:
assert True
else:
assert False
PEP 614
Decorator syntax @field_property(bar).setter
is only valid in Python 3.9. Previous version can use the following hack:
from dataclasses import dataclass
from field_properties import field_property
@dataclass
class Foo:
bar: int = field_property()
def set_bar(self, value: int):
...
field_property(bar).setter(set_bar)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file field-properties-0.1.tar.gz
.
File metadata
- Download URL: field-properties-0.1.tar.gz
- Upload date:
- Size: 5.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
7be49d9532732f31f70cb6c0b8b860589c6d85dcdd10cdd3f9d27182adae7aa8
|
|
MD5 |
5cd11de1b649344085eca8747a97c600
|
|
BLAKE2b-256 |
2da79796fc7a39276298ec8a3121d3d6e45803ec6b2140ad7772efa43ed6cfa1
|
File details
Details for the file field_properties-0.1-py3-none-any.whl
.
File metadata
- Download URL: field_properties-0.1-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
39b9bc6893dc363f671f27bd3ed8b78597c00d0696e6e24f1093351d048df31d
|
|
MD5 |
38d6146f3d252efe7d6a0486ca1566fa
|
|
BLAKE2b-256 |
d4d05ee81b51e3108d679bcf98124e5a353efaababd47dd337b79912aa6c5e38
|