请考虑这段python 3.5代码:
class Foo:
pass
class Bar(Foo):
pass
class AbstractSomething:
def get_foobinator_type(self):
return Foo
我想注释using PEP-0484 annotations)get_foobinator_type
方法的返回值来说:“它返回一个类型,即Foo
或其任何子类型”。
我在Python中找不到任何合理的方法。以下是明显错误的方法:
以下:def get_foobinator_type(self) -> Foo
表示此方法返回Foo
的实例。
以下:def get_foobinator_type(self) -> type
表示此方法返回一个类型,但遗憾的是,没有相关信息需要它是Foo
的子类型。
在Java术语中,我希望使用签名方法:Class<Foo> getFoobinatorType()
。
答案 0 :(得分:1)
据我了解,你真的不能。您正在寻找一种方法来指示类的返回类型;根据类的类型进行检查,即其元类。
问题在于,元类检查器无法帮助类型检查器评估对象的继承性,如果它的类型为type
,则它是正常的。
除此之外,并且不确定您使用哪种类型检查器,mypy
例如doesn't have support yet用于自定义元类,您可以使用它来将对象分组到更自定义的组中。
我看到它的方式,你要么根本不注释,要么改变实现并用Foo
注释。
答案 1 :(得分:1)
最近(在Python 3.5.2
中)引入了通用Type
,因此解决方案是:
class AbstractSomething:
def get_foobinator_type(self) -> typing.Type[Foo]:
return Bar
请参阅:python docs。
答案 2 :(得分:0)
我认为你需要的是打字模块中的TypeVar。
from typing import TypeVar
class Foo:
pass
class Bar(Foo):
pass
T = TypeVar('T', bound=Foo)
class AbstractSomething:
def get_foobinator_type(self) -> T:
return Foo
From the documentation of typing:
或者,类型变量可以使用指定上限 绑定=。这意味着实际类型被替换(显式 或者隐含地)对于类型变量必须是。的子类 边界类型,见PEP 484