相关疑难解决方法(0)

如何访问typing.Generic的类型参数?

该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)

python generics

22
推荐指数
3
解决办法
3667
查看次数

Generic[T] 基类 - 如何从实例中获取 T 的类型?

假设您有一个继承自 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)

似乎没有诀窍。

谢谢

python generics python-3.x

10
推荐指数
4
解决办法
1874
查看次数

访问用户定义的 Generic[T] 类的任何特定子类中的类型参数

语境

假设我们要定义一个继承自 的自定义通用(基)类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.

相关问题

python generics base-class python-typing

2
推荐指数
1
解决办法
1128
查看次数

标签 统计

generics ×3

python ×3

base-class ×1

python-3.x ×1

python-typing ×1