'Mypy marks error when using TypeVar type inside TypeDict derived class

I have the following code:

WriterMeta = typing.TypeVar('WriterMeta', GSheetWritable, S3Writable, LocalWritable)


class WriterDesc(typing.TypedDict):
    name: str
    meta: WriterMeta


class DataWriter(ABC, typing.Generic[WriterMeta]):
    """Defines the interface for all data writers"""

    @abstractproperty
    def connector(self) -> typing.Any:
        pass

    @abstractproperty
    def target(self) -> typing.Any:
        pass

    @abstractmethod
    def write(self, data: pd.DataFrame, meta: WriterMeta, versionize: bool):
        """This method performs the writing of 'data'.

        Every concrete class implementing this method must implement its writing
        using 'connector'
        """
        pass


class LocalOutputWriter(DataWriter[LocalWritable]):
    def __init__(self, settings, timestamp, env):
        self._connector = None
        self._target = None
        self.timestamp = timestamp
        self.settings = settings
        self.env = env

    @property
    def connector(self) -> typing.Any:
        return self._connector

    @property
    def target(self) -> typing.Any:
        return self._target

    def get_file_name(self, data_name: str, versionize: bool) -> str:
        if versionize:
            file_name = "{}_{}_{}_{}".format(
                self.settings["scm_week"],
                data_name,
                self.settings["volume_source"],
                self.timestamp,
            )
        else:
            file_name = data_name

        file_name = file_name + ".csv"

        return file_name

    def write(self, data: pd.DataFrame, meta: LocalWritable, versionize: bool):
        data = data.replace({np.nan: "NaN", np.Inf: "Inf"})
        file_name = self.get_file_name(meta["file_name"], versionize)

        print("Writing '{}' file to local.".format(file_name))
        data.to_csv(file_name)

The code works as expected, but mypy marks the following error:

error: Type variable "outputs.WriterMeta" is unbound
note: (Hint: Use "Generic[WriterMeta]" or "Protocol[WriterMeta]" base class to bind "WriterMeta" inside a class)

How can use a TypeVar datatype inside a TypeDict derived class?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source