如何注释返回特定类型(或子类型)的方法

时间:2016-08-18 10:16:24

标签: python python-3.x

请考虑这段python 3.5代码:

class Foo:
    pass

class Bar(Foo):
   pass

class AbstractSomething: 

    def get_foobinator_type(self):  
        return Foo

我想注释using PEP-0484 annotationsget_foobinator_type方法的返回值来说:“它返回一个类型,即Foo或其任何子类型”。

我在Python中找不到任何合理的方法。以下是明显错误的方法:

  • 以下:def get_foobinator_type(self) -> Foo表示此方法返回Foo实例

  • 以下:def get_foobinator_type(self) -> type表示此方法返回一个类型,但遗憾的是,没有相关信息需要它是Foo的子类型。

在Java术语中,我希望使用签名方法:Class<Foo> getFoobinatorType()

3 个答案:

答案 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