returns self 和 python pep484 类型检查应该如何做上层方法

How should one do upper level method that returns self with python pep484 type checking

如何在 class 中定义函数,使得函数的 return 类型是 'current class' - 而不是基础 class。例如:

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

或者应该以某种方式施放它?如果return类型是baseclass,那么就会报错

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

我使用 mypy 进行类型检查。

您可以使用新实现的(仍处于实验阶段)generic self 功能,这是一种旨在帮助准确解决您遇到的问题的机制。

Mypy 从 version 0.4.6 开始支持 "generic self" 特性(注意:撰写本文时 mypy 的最新版本是 0.470)。不幸的是,我不记得其他符合 PEP 484 的类型检查器是否支持此功能。

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

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

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 class 限制——这样,在 set_common_properties 方法中,我们就可以调用任何Parent.

中的其他方法

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