Rory Samson
Rory Samson

Reputation: 85

How to handle typing of member variable that is initialized during __post_init__() of dataclass

The variable below is initialized as none, but during __post_init__ it is replaced with an instance of outlook client.

@dataclass
class Config:
    """Outlook configuration"""

    mailbox: str
    inbox: str
    mailbox_obj: Union["Mailbox", None] = None

However, static type analysis correctly informs that mailbox_obj has no members (...is not a known member of "None"). I don't want to guard everything with if mailbox_obj just to satisfy the type analysis. Is there another way using a dataclass field or something?

The problem would go away if I just used a regular class since I can initialize the problem variable in init where the type will be inferred to it's set value, but then I have to write that extra boilerplate.

Writing this question has reminded me of the below, which is probably what I'm looking for:

    mailbox_obj: "Mailbox" = field(init=False)

Is that the right way?

Upvotes: 1

Views: 329

Answers (1)

juanpa.arrivillaga
juanpa.arrivillaga

Reputation: 95948

Yes, you want to specify that it is not an init field, so you just want something like this:

import dataclasses

class Mailbox:
    pass

@dataclasses.dataclass
class Config:
    """Outlook configuration"""

    mailbox: str
    inbox: str
    mailbox_obj: "Mailbox" = dataclasses.field(init=False)

    def __post_init__(self):
        # do some stuff...
        self.mailbox_obj = Mailbox()

I saved the above code in a file called test_typing.py and here is mypy:

(py310) Juans-MBP:test juan$ mypy test_typing.py
Success: no issues found in 1 source file

Upvotes: 1

Related Questions