问题描述
我无法让Mypy在这里识别正确的类型。我要做的就是为类创建一个dict
的名称,因此我可以通过提供type_name
作为其属性来获取该类。也许是因为dataclass
和dataclasses-json
的东西引起了混淆?
# mypy_test.py
from dataclasses import dataclass
from typing import Any,Dict,Type,TypeVar
from dataclasses_json import DataClassJsonMixin
@dataclass
class _BaseDataItem(DataClassJsonMixin):
name: str # functions as an ID. Subclasses should NOT modify its value after creation.
type_name: str
body: Any = None
# etc ...
@dataclass
class DatanetItem(_BaseDataItem):
type_name: str = "datanet"
@dataclass
class RedshiftItem(_BaseDataItem):
type_name: str = "redshift"
# https://mypy.readthedocs.io/en/stable/kinds_of_types.html#the-type-of-class-objects
IT = TypeVar("IT",bound=_BaseDataItem)
items2classes: Dict[str,Type[IT]] = {
c.type_name: c for c in (DatanetItem,RedshiftItem)
}
def create_obj(name: str,item_type: str) -> _BaseDataItem:
klass = items2classes[item_type]
obj = klass(name)
return obj
用法示例:
In [1]: import mypy_test as m
In [2]: m.create_obj('123','datanet')
Out[2]: DatanetItem(name='123',type_name='datanet',body=None)
In [3]: m.create_obj('mytable','redshift')
Out[3]: RedshiftItem(name='mytable',type_name='redshift',body=None)
尽管我以为我遵循了in the docs的说明,但由于某些原因,MyPy一直给我这个错误:
mypy_test.py:28: error: Type variable "mypy_test.IT" is unbound
mypy_test.py:28: note: (Hint: Use "Generic[IT]" or "Protocol[IT]" base class to bind "IT" inside a class)
mypy_test.py:28: note: (Hint: Use "IT" in function signature to bind "IT" inside a function)
mypy_test.py:35: error: Cannot instantiate type "Type[IT?]"
Found 2 errors in 1 file (checked 1 source file)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)