'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 |
|---|
