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 中找到更多信息:
如何在 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 中找到更多信息: