【问题标题】:Type hinting propagation for overriding methods覆盖方法的类型提示传播
【发布时间】:2014-04-18 18:41:37
【问题描述】:

是否可以将类型提示传播到覆盖方法?

说,我有以下课程:

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 中完全缺失的?

【问题讨论】:

  • 我也在使用 PyCharm 3.1.1,我在 make_foo_from_bar 中获得了有关 Bar 方法的建议。如果您从一个新项目开始,是否会出现同样的问题?
  • 没关系,您的示例似乎已关闭 - PyCharm 推断 bar 是 Bar 类型,即使没有任何提示。
  • 看来我已经过分简化了,我会在一分钟内更新问题。

标签: python pycharm


【解决方案1】:

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

PyCharm 所做的以及似乎让您感到困惑的是快速猜测并确定Student 将是一个名为student 的参数的合理类。没有类Options,所以启发式失败。

因此,如果您真的非常想要类型提示,那么除了在您想要它们的任何地方指定它们之外,真的别无选择。

如果您使用的是 Python 3,您可以尝试新的语言内类型提示(注解)语法:

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

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2020-11-30
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多