根据这个问题描述的解决方案:如何访问typing.Generic的类型参数?
我已经成功地在Python 3.8中运行了泛型类型。但是,我似乎无法访问解决方案中针对Python 3.6描述的__args__
字段。我不确定原因,这是我的代码:
def get_generic_type_arg(cls):
if py_version >= (3, 8):
t = cls.__orig_bases__[0]
return get_args(t)[0]
else:
t = cls.__args__
return None
class EventContract:
@classmethod
def get_version(cls) -> int:
return int(cls.__name__[1:])
RT = TypeVar('RT', bound=EventContract)
class QueryContract(Generic[RT], EventContract):
""" Base class for query contracts that are versioned. """
@classmethod # Do not override this
def get_response_class(cls) -> Type[RT]:
return get_generic_type_arg(cls)
def build_result(self, *args, **kwargs):
return self.get_response_class()(**kwargs)
@dataclasses.dataclass
class V1Response(EventContract):
value: int
@dataclasses.dataclass
class V1(QueryContract[V1Response]):
id: int
name: str
尝试在cls上调用get_generic_type时,我收到了AttributeError。 我还尝试使用t.__bases__ [0]获取其基类,它给我带来没有泛型参数的QueryContract(__args__给我另一个属性错误)。 我正在对V1调用get_response_class方法。 有什么想法吗?