从类列表中键入Python

从类列表中键入Python,python,python-3.x,python-typing,Python,Python 3.x,Python Typing,如何为类列表执行python类型输入 假设我有以下课程 from dataclasses import dataclass @dataclass class A: name: str @dataclass class B: age: int #... CLASSES = [A, B] #... more classes in list 现在,我定义了一个实例化以下任何一个类的函数 def func(resource: Union[*CLASSES], value: Uni

如何为类列表执行python类型输入

假设我有以下课程

from dataclasses import dataclass

@dataclass
class A:
    name: str

@dataclass
class B:
   age: int

#...
CLASSES = [A, B]  #... more classes in list
现在,我定义了一个实例化以下任何一个类的函数

def func(resource: Union[*CLASSES], value: Union[str, int]):
    return resource(value)

但是类型暗示在这里无效如何从列表中进行类型提示?

这将使用所有预期类共享的超类实现您想要的功能:

from typing import Union
from dataclasses import dataclass


@dataclass
class MyDataMixin:
    pass


@dataclass
class A(MyDataMixin):
    name: str


@dataclass
class B(MyDataMixin):
    age: int


def func(resource: MyDataMixin, value: Union[str, int]):
    return resource
您不能像之前尝试的那样在参数的类型定义中使用扩展,这只能在运行时对变量起作用


正如@Selcuk在注释中指出的,将其命名为
MyDataMixin
更有意义,因为该类不打算自己使用。您可以进一步确保它只是一个抽象类,但这超出了问题的范围。

您所说的“类型转换”到底是什么意思?请具体说明。注意,“类型转换”并不是一个真正适用于python的术语,尽管它在informall中被用来表示“类型转换”。如果您有10个或更多的类,那么您的代码已经出现了严重的错误-它们可能共享一个更匹配的超类;无论如何,您不能使用变量的扩展来获取存储在变量中的类型来定义函数参数的类型-您混合了运行时和编译时信息类型提示必须是静态的,以便linter可以验证它们。不,类型提示仅用于IDE/linter,以便更容易发现错误。解释器不使用它们(至少CPython不使用)。您不必使用
联合
;你可以使用@Grismar在他们的答案中建议的内容。只有在使用无法修改的内置类或第三方类时,才需要联合。这是否回答了您的问题?最好将其命名为
Mixin
,以便在需要时可以扩展其他(实际的)超类。我是否应该使用ABC而不是dataclass作为父类?是的,Mixin本身不必是dataclass,尽管它当然可以。除非您有特定的理由想要使用抽象基类,比如要求在每个子类上实现一个抽象方法,否则我不会选择使用
ABC
,但这远远超出了您的要求。仅从共享基类继承就足够了。其他一切都是另一回事。