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 中,一些类型结构如 Type
、List
和 Dict
已弃用,因为您可以只使用内置类型。所以上面的注释可以像 type[E]
这样定义,如果你有更新的 Python 版本。
我有一个接收 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 中,一些类型结构如 Type
、List
和 Dict
已弃用,因为您可以只使用内置类型。所以上面的注释可以像 type[E]
这样定义,如果你有更新的 Python 版本。