如何使用python pep484类型检查来执行返回self的上层方法

时间:2017-02-21 08:46:13

标签: python python-3.x typechecking mypy

如何定义一个类中的函数,使得函数的返回类型是“当前类”' - 而不是基类。例如:

Class Parent:
   def set_common_properties_from_string( input : str ) -> <WHAT SHOULD BE HERE>
     # Do some stuff you want to do in all classes
     return self

Class Child( Parent ):
   pass

   def from_file( filename : str ) -> 'Child'
      return Child().set_common_properties_from_string() # The return type of set_common must be Child

或者应该以某种方式投射它?如果返回类型是baseclass,那么它将给出错误。

我知道可以将它放到两行并添加用于保存Child()的临时变量,但我认为一个衬里更好看。

我使用mypy进行类型检查。

1 个答案:

答案 0 :(得分:1)

您可以使用新实施的(仍然是实验性的)generic self功能,该功能旨在帮助您解决您遇到的问题。

Mypy支持&#34;通用自我&#34;截至version 0.4.6的特征(注意:截至撰写本文时,mypy的最新版本为0.470)。不幸的是,如果其他PEP 484兼容类型检查器支持此功能,我也不记得了。

简而言之,您需要做的是创建一个新的TypeVar,显式注释您的self变量以具有该类型,并将TypeVar作为返回值。

因此,在您的情况下,您需要将代码修改为以下内容:

from typing import TypeVar

T = TypeVar('T', bound='Parent')

class Parent:
    def set_common_properties(self: T, input: str) -> T:
        # Do some stuff you want to do in all classes
        return self

class Child(Parent):
    def from_file(self, filename: str) -> 'Child':
        # More code here
        return Child().set_common_properties(...)

请注意,我们需要将我的TypeVar设置为由Parent类限定 - 这样,在set_common_properties方法中,我们可以调用任何其他生活方法在Parent内。

您可以在mypy的网站和PEP 484中找到更多信息: