Skip to main content

Slightly improved dataclasses

Project description

The Python built-in datacls is almost perfect, and this module just adds a little bit on top of it to smooth the rough edges a bit.


@datacls.mutable is @dataclasses.dataclass() , except:


@datacls.immutable or just @datacls is like datacls.mutable except frozen=True by default.


datacls.field() just like dataclasses.field() except default_factory is now (also) a positional parameter.

Usage examples

import datacls
from typing import Dict

@datacls
class One:
    one: str = 'one'
    two: int = 2
    three: Dict = datacls.field(dict)  # Simplified `field`

#
# Three new instance methods
#
o = One()
assert o.asdict() == {'one': 'one', 'two': 2, 'three': {}}
assert o.astuple() == ('one', 2, {})

o2 = o.replace(one='seven', three={'nine': 9})
assert o2 == One('seven', 2, {'nine': 9})

#
# A new class method
#
assert [f.name for f in One.fields()] == ['one', 'two', 'three']

#
# Immutable by default
#
try:
    o.one = 'three'
except AttributeError:
    pass
else:
    raise AttributeError('Was mutable!')

@datacls.mutable
class OneMutable:
    one: str = 'one'
    two: int = 2
    three: Dict = datacls.field(dict)

om = OneMutable()
om.one = 'three'
assert str(om) == "OneMutable(one='three', two=2, three={})"

#
# These four new methods won't break your old dataclses:
#
@datacls
class Overloads:
    one: str = 'one'
    asdict: int = 1
    astuple: int = 1
    fields: int = 1
    replace: int = 1

o = Overloads()
assert ov.one == 'one'
assert ov.asdict == 1
assert ov.astuple == 1
assert ov.fields == 1
assert ov.replace == 1

# In this case, you can access them as functions on `datacls`:
assert (
    datacls.asdict(ov) ==
    {'asdict': 1, 'astuple': 1, 'fields': 1, 'one': 'one', 'replace': 1}
)

assert datacls.astuple(ov) == ('one', 1, 1, 1, 1)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

datacls-1.1.0.tar.gz (3.9 kB view details)

Uploaded Source

Built Distribution

datacls-1.1.0-py3-none-any.whl (3.8 kB view details)

Uploaded Python 3

File details

Details for the file datacls-1.1.0.tar.gz.

File metadata

  • Download URL: datacls-1.1.0.tar.gz
  • Upload date:
  • Size: 3.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/33.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.2 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.7.0

File hashes

Hashes for datacls-1.1.0.tar.gz
Algorithm Hash digest
SHA256 4d3f9ad29d691b08f5e65384b73d150f53209b80de16dd5f1b649a32bac6d1ef
MD5 e5eb6fcf5db0dbddb8b1d4b600fe64f1
BLAKE2b-256 1ca08188cd36ec3bb9c9124b135ee5631aa013da17db7a2eae3d64fd59114a6b

See more details on using hashes here.

File details

Details for the file datacls-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: datacls-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 3.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/33.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.2 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.7.0

File hashes

Hashes for datacls-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3bbdc0c8601a74ccb15a5d1091dd84c76f2909a7d6c4a15142a1c1be82befbfa
MD5 590eed9639ac94b449cf58a8be06560b
BLAKE2b-256 4c7b74ef3d20902cd77e97c990e7e74e8f4a1217d9c7ab88b6dfa00fb02f89d3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page