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.0.0.tar.gz (3.8 kB view details)

Uploaded Source

Built Distribution

datacls-1.0.0-py3-none-any.whl (3.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: datacls-1.0.0.tar.gz
  • Upload date:
  • Size: 3.8 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.0.0.tar.gz
Algorithm Hash digest
SHA256 554f8c0bbecc79c8e1fb75eeefa090fa5b35584df3c68c5f83bd33363aa75297
MD5 c195370cca780168dd95a2a58db76303
BLAKE2b-256 71d1a90a4d87733d2ae9417e481c1b81d6ad60114adb6ad34c2232943a9a18a3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: datacls-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 3.7 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.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7db2011a8c6c5ee4174db0d9d8997e9f785881d5449e350b7b04972218879d32
MD5 e88af779dc3d52ef6479fa192d9c8b01
BLAKE2b-256 0c29fdd7620cb5e5388fa55410e3383b349a1907a2200b3cc6b96ea0388bfdde

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