Skip to main content

Load and dump data from json-like format into typed data structures

Project description

typedload

Load and dump json-like data into typed data structures in Python3, enforcing a schema on the data.

This module provides an API to load dictionaries and lists (usually loaded from json) into Python's NamedTuples, dataclass, sets, enums, and various other typed data structures; respecting all the type-hints and performing type checks or casts when needed.

It can also dump from typed data structures to json-like dictionaries and lists.

It is very useful for projects that use Mypy and deal with untyped data like json, because it guarantees that the data will follow the specified schema.

It is released with a GPLv3 license but it is possible to ask for LGPLv3.

GPLv3 logo

Donate to LtWorf

Example

For example this dictionary, loaded from a json:

data = {
    'users': [
        {
            'username': 'salvo',
            'shell': 'bash',
            'sessions': ['pts/4', 'tty7', 'pts/6']
        },
        {
            'username': 'lop'
        }
    ],
}

Can be treated more easily if loaded into this type:

@dataclasses.dataclass
class User:
    username: str
    shell: str = 'bash'
    sessions: List[str] = dataclasses.field(default_factory=list)

class Logins(NamedTuple):
    users: List[User]

And the data can be loaded into the structure with this:

t_data = typedload.load(data, Logins)

And then converted back:

data = typedload.dump(t_data)

Supported types

Since this is not magic, not all types are supported.

The following things are supported:

  • Basic python types (int, str, bool, float, NoneType)
  • NamedTuple
  • Enum
  • Optional[SomeType]
  • List[SomeType]
  • Dict[TypeA, TypeB]
  • Tuple[TypeA, TypeB, TypeC] and Tuple[SomeType, ...]
  • Set[SomeType]
  • Union[TypeA, TypeB]
  • dataclass
  • attr.s
  • ForwardRef (Refer to the type in its own definition)
  • Literal (requires Python 3.8)
  • TypedDict (requires Python 3.8)
  • datetime.date, datetime.time, datetime.datetime
  • Path
  • IPv4Address, IPv6Address
  • typing.Any
  • typing.NewType

Unions

typedload works fine with untagged unions. However using Literal fields to tag them makes it much faster.

Using Mypy

Mypy and similar tools work without requiring any plugins.

# This is treated as Any, no checks done.
data = json.load(f)

# This is treated as Dict[str, int]
# but there will be runtime errors if the data does not
# match the expected format
data = json.load(f)  # type: Dict[str, int]

# This is treated as Dict[str, int] and an exception is
# raised if the actual data is not Dict[str, int]
data = typedload.load(json.load(f), Dict[str, int])

So when using Mypy, it makes sense to make sure that the type is correct, rather than hoping the data will respect the format.

Extending

Type handlers can easily be added, and existing ones can be replaced, so the library is fully cusomizable and can work with any type.

Inheriting a base class is not required.

Install

  • pip install typedload
  • apt install python3-typedload
  • Latest and greatest .deb file is in releases

Documentation

The tests are hard to read but provide more in depth examples of the capabilities of this module.

Used by

As dependency, typedload is used by those entities. Feel free to add to the list.

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

typedload-2.25.tar.gz (75.2 kB view details)

Uploaded Source

Built Distribution

typedload-2.25-py3-none-any.whl (53.4 kB view details)

Uploaded Python 3

File details

Details for the file typedload-2.25.tar.gz.

File metadata

  • Download URL: typedload-2.25.tar.gz
  • Upload date:
  • Size: 75.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for typedload-2.25.tar.gz
Algorithm Hash digest
SHA256 69f06b45e4350455f72a33d63bc93f4925f1d9dcb2ceb7e398f148296c1e9ed4
MD5 dca77e207be0c5cb0cc134aada24cb7a
BLAKE2b-256 3679b86a6e33e1d61125ada92eb63d44576e43387f5f4a64cec292c4483513cf

See more details on using hashes here.

File details

Details for the file typedload-2.25-py3-none-any.whl.

File metadata

  • Download URL: typedload-2.25-py3-none-any.whl
  • Upload date:
  • Size: 53.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for typedload-2.25-py3-none-any.whl
Algorithm Hash digest
SHA256 8bd2a83fd1c2db51e120cf7ecfcfc9878a26d9b34fd692e34f0bd4216afa40c2
MD5 2b4045eccefe90d542eacd712fd1e48c
BLAKE2b-256 cc5c7220b2c9a9e4c96f3d403b8a168c5ea87c6b8235eeac5cbcdce58f6df96a

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