Python 键入 - return 值是参数的实例

Python typing - return value is instance of parameter

我有一个接收 class 和 return 的 class 实例的函数。一个简单的例子:

def instantiate(class_: Type[enum.Enum], param: str) -> enum.Enum:
    return class_(param)

return值与参数class_的类型相同,所以如果class_是MyEnum,return值将类型为 MyEnum.

有什么方法可以声明吗?

这很标准。你会发现这个 in the documentation pretty top level:

from typing import Type


class MyClass:
    def __init__(self, param: str) -> None:
        self.param = param


def instantiate(cls: Type[MyClass], param: str) -> MyClass:
   return cls(param)

当然有!这应该非常适合您的用例。

from enum import Enum
from typing import TypeVar, Type


E = TypeVar('E', bound=Enum)


def instantiate(class_: Type[E], param: str) -> E:
    return class_(param)

并对其进行快速测试以确认类型提示是否按预期工作:

class MyEnum(Enum):
    ONE = '1'
    TWO = '2'


# I hover over 'e' and PyCharm is able to infer it's of type MyEnum.
e = instantiate(MyEnum, '1')

print(e)
# MyEnum.ONE

注意: 如评论中所述,在 Python 3.9 中,一些类型结构如 TypeListDict 已弃用,因为您可以只使用内置类型。所以上面的注释可以像 type[E] 这样定义,如果你有更新的 Python 版本。