该typing模块为泛型类型提示提供了一个基类:typing.Generic该类.
Generic方括号中的accept类型参数的子类,例如:
list_of_ints = typing.List[int]
str_to_bool_dict = typing.Dict[str, bool]
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何访问这些类型的参数?
也就是说,str_to_bool_dict作为输入,我如何得到str和bool作为输出?
基本上我正在寻找一个这样的功能
>>> magic_function(str_to_bool_dict)
(<class 'str'>, <class 'bool'>)
Run Code Online (Sandbox Code Playgroud) 假设您有一个继承自 Generic[T] 的 Python 类。有没有办法获得从类/实例中传入的实际类型?
例如,
from typing import TypeVar, Type
T = TypeVar('T')
class Test(Generic[T]):
def hello(self):
my_type = T # this is wrong!
print( "I am {0}".format(my_type) )
Test[int]().hello() # should print "I am int"
Run Code Online (Sandbox Code Playgroud)
在这里,建议类型 arg 出现在类型的 args 字段中。而且确实,
print( str( Test[int].__args__ ) )
Run Code Online (Sandbox Code Playgroud)
将打印 (<class 'int'>,)。但是,我似乎无法直接从实例中访问它,例如替换
my_type = self.__class__.__args__ # this is also wrong (None)
Run Code Online (Sandbox Code Playgroud)
似乎没有诀窍。
谢谢
假设我们要定义一个继承自 的自定义通用(基)类typing.Generic。
为了简单起见,我们希望它由单个类型变量 T来参数化。所以类的定义是这样开始的:
from typing import Generic, TypeVar
T = TypeVar("T")
class GenericBase(Generic[T]):
...
Run Code Online (Sandbox Code Playgroud)
T 有没有办法访问 的任何特定子类中的类型参数GenericBase?
该解决方案应该足够通用,能够在具有附加基础的子类中工作GenericBase,并且独立于实例化(即在类级别上工作)。
期望的结果是这样的类方法:
class GenericBase(Generic[T]):
@classmethod
def get_type_arg(cls) -> Type[T]:
...
Run Code Online (Sandbox Code Playgroud)
class Foo:
pass
class Bar:
pass
class Specific(Foo, GenericBase[str], Bar):
pass
print(Specific.get_type_arg())
Run Code Online (Sandbox Code Playgroud)
输出应该是<class 'str'>.
如果所有相关的类型注释都已完成,以便静态类型检查器可以正确推断get_type_arg.