重写方法的类型提示传播

1 投票
1 回答
1618 浏览
提问于 2025-04-17 22:11

可以把类型提示传递到重写的方法吗?

比如,我有以下这些类:

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

撰写回答