重写方法的类型提示传播
可以把类型提示传递到重写的方法吗?
比如,我有以下这些类:
class Student:
def study():
pass
class Option:
self.option_value
class BaseChoice:
def make_choice(self, student, options):
"""
:type student: Student
:type options: list[Option]
"""
class RationalChoice(BaseChoice):
def make_choice(self, student, options):
pass
当我在 RationalChoice.make_choice
这个方法里时,pycharm并没有给出 options
属性或方法的自动补全建议,但对于 student
却能正确显示提示。显而易见的解决办法是直接复制文档字符串,但我会有十几个不同的 BaseChoice
子类,这样做就不太实际了。
我使用的是 PyCharm 3.1.1,社区版和专业版都有这个问题。
这是Python本身完全缺失的功能,还是只是PyCharm的问题呢?
1 个回答
3
PyCharm在重写方法时并不会考虑父类的类型提示。我不确定这是个bug还是一个特性,不过我倾向于认为这是特性:在Python中,重写的方法不需要和被重写的方法有相同的签名或接受相同的类型。换句话说,BaseChoice上的类型提示并不自动适用于RationalChoice。
PyCharm所做的事情,可能让你感到困惑,是它会快速猜测,认为Student
是一个合适的参数类型,适用于名为student
的参数。但是因为没有Options
这个类,所以这个猜测就失败了。
所以如果你真的非常想要类型提示,那就只能在你想要的每个地方都明确地指定它们。
如果你使用的是Python 3,可以尝试新的语言内类型提示(注解)语法:
class RationalChoice(BaseChoice):
def make_choice(self, student: Student, options: list):
return