Skip to main content

Slightly improved dataclasses, backward compatible

Project description

  • dataclass: like dataclasses.dataclass, except:
    • Adds three new instance methods to each dataclass
      • asdict(), astuple(), replace()

    • …and one new class method,
      • fields()

    • frozen=True is now the default!

    • xmod -ed for less cruft

  • dataclass.field: Like dataclasses.field, except:
    • default_factory is now a positional parameter

    • perfectly backward compatible

Usage examples

import dataclass
from typing import Dict

@dataclass
class One:
    one: str = 'one'
    two: int = 2
    three: Dict = dataclass.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!')

@dataclass(frozen=False)
class OneMutable:
    one: str = 'one'
    two: int = 2
    three: Dict = dataclass.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 dataclasses:
#
@dataclass
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 functions on dataclass:
assert (
    dataclass.asdict(ov) ==
    {'asdict': 1, 'astuple': 1, 'fields': 1, 'one': 'one', 'replace': 1}
)

assert dataclass.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

dataclas-0.9.3.tar.gz (3.6 kB view hashes)

Uploaded Source

Built Distribution

dataclas-0.9.3-py3-none-any.whl (3.5 kB view hashes)

Uploaded Python 3

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