用于覆盖方法的类型提示传播

时间:2014-03-13 19:13:44

标签: python pycharm

是否可以将类型提示传播给重写方法?

说,我有以下课程:

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 个答案:

答案 0 :(得分:1)

在重写方法时,PyCharm不查看超类类型提示。我不知道这是一个错误还是一个功能,虽然我倾向于后者:Python不需要重写方法来拥有相同的签名或接受与它们覆盖的方法相同的类型。换句话说,BaseChoice上的类型提示对于RationalChoice不会自动有效。

PyCharm做了什么,以及让你感到困惑的是,快速猜测并确定Student对于名为student的参数来说是一个合理的类。没有类Options,因此启发式失败。

因此,如果你真的想要类型提示,那么除了你想要它们之外别无他法。

如果您使用的是Python 3,则可以尝试使用新的in-language类型提示(注释)语法:

class RationalChoice(BaseChoice):
    def make_choice(self, student: Student, options: list):
        return