我想对以下函数使用类型提示:
def get_obj_class(self) -> CLASS_TYPE:
return self.o.__class__
CLASS_TYPE
应表示class
。self.o
可以是在运行时确定的任何类型。
同样地,如果我有一个函数f(cls: CLASS_TYPE)
,它返回cls
的实例,是否有一种方式适当地对返回值进行类型提示?
我想对以下函数使用类型提示:
def get_obj_class(self) -> CLASS_TYPE:
return self.o.__class__
CLASS_TYPE
应表示class
。self.o
可以是在运行时确定的任何类型。同样地,如果我有一个函数f(cls: CLASS_TYPE)
,它返回cls
的实例,是否有一种方式适当地对返回值进行类型提示?
我建议采用TypeVar
的组合,以表示您的self.o
值可以是任意类型,并采用以下方式使用Type
:
from typing import TypeVar, Type
T = TypeVar('T')
class MyObj:
def __init__(self, o: T) -> None:
self.o = o
def get_obj_class(self) -> Type[T]:
return type(self.o)
def accept_int_class(x: Type[int]) -> None:
pass
i = MyObj(3)
foo = i.get_obj_class()
accept_int_class(foo) # Passes
s = MyObj("foo")
bar = s.get_obj_class()
accept_int_class(bar) # Fails
o
的类型更加动态,你可以显式或隐式地将其类型指定为 Any
。
def f(cls: Type[T]) -> T:
return cls()
__init__
函数/使用了正确数量的参数。这是因为T可以是任何东西,但没有办法提示构造函数应该看起来像什么,因此执行此检查将变得非常困难或者几乎不可能。对于Python >=3.7,使用type
(还可以参考PEP 585):
def get_obj_class(self) -> type:
return self.o.__class__
对于Python <3.7,使用typing.Type
:
def get_obj_class(self) -> typing.Type:
return self.o.__class__
typing.TypeVar
似乎是正确的解决方案 - yspreen那 typing.Type
呢?
看起来很合适,因为 __class__
应该始终返回一个类型。
import typing
def test(t: object) -> typing.Type:
return t.__class__
class Dummy(object):
pass
test(Dummy())
typing.Type
而不是 type
? - yspreen
type
。但是感谢您介绍这个。 - yspreen