Default values for TypedDict

4.9k views Asked by At

Let's consider I have the following TypedDict:

class A(TypedDict):
    a: int
    b: int

What is the best practice for setting default values for this class?

I tried to add a constructor but it doesn't seem to work.

class A(TypedDict):
    a: int
    b: int
    def __init__(self):
        TypedDict.__init__(self)
        a = 0
        b = 1

EDIT: I don't want to use dataclass because I need to serialize and deserialize to JSON files and dataclasses have some problem with it.

What do you think?

1

There are 1 answers

3
Eddie Bergman On BEST ANSWER

TypedDict is only for specifying that a dict follows a certain layout, not an actual class. You can of course use a TypedDict to create an instance of that specific layout but it doesn't come with defaults.

One possible solution is to add a factory method to the class. You could use this factory method instead to set defaults.

from typing import TypedDict

class A(TypedDict):
    a: int
    b: int

    @classmethod
    def create(cls, a: int = 0, b: int = 1) -> A:
        return A(a=a, b=b)

a = A.create(a=4)
# {"a": 4, "b": 1}

If having a dict is not a strict requirement then @dataclass is good having small objects with defaults.

from dataclasses import dataclass

@dataclass
class A:
    a: int = 0
    b: int = 1

If you need to create a dictionary from them, you can use asdict

from dataclasses import asdict

a = A(a=4)
asdict(a)  # {"a": 4, "b": 1}