当前位置: 首页 > 知识库问答 >
问题:

重写方法的类型提示传播

姬经义
2023-03-14

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

比方说,我有以下课程:

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

当我在理性选择中时。make_choicepycharm不建议对选项属性/方法进行自动完成,但它为学生选择了正确的提示。显而易见的解决方法是只复制docstring,但我将有几十个不同的BaseChoice子体,因此这并不实用。

我正在使用PyCharm 3.1。1、社区版和专业版都会受到影响。

它是python本身完全缺少的东西,还是仅仅在PyCharm中?

共有1个答案

赵刚豪
2023-03-14

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

PyCharm所做的,似乎让你困惑的是,快速猜测并决定学生将是一个名为学生的参数的合理类。没有类Options,因此启发式失败。

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

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

class RationalChoice(BaseChoice):
    def make_choice(self, student: Student, options: list):
        return
 类似资料:
  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代

  • 问题内容: 我想知道用这样的签名调用静态方法的正确方法是什么: 由于某种原因,我很想这样称呼它: 但是除非我将其更改为:否则它不会编译: 我只是想知道为什么它不需要右侧的提示。而是给了我编译错误。它说它期望在右侧的提示后加上分号。第二个方法是调用该方法的正确方法吗?有人可以给我一些启示吗? 问题答案: 如图所示这里,要调用的方法的方法是: 该方法所在的类的名称在哪里。

  • 我试图在Python3.5中使用类型提示。1,代码如下: 我猜在解析类型A时,类型A还没有完全构造,这是范围界定的问题,但我不理解为什么这样的语法不正确。是否有其他方式来表达它,或者它只是一个非法的构造? 我想在基类中使用这个语法提示,它可以在树状层次结构中组成派生类。

  • 我正在编写一个包含一个对象的库,该对象允许对其某些方法进行方法链接。我想为这个库的用户提供一个简单的方法来知道是否有任何特定的方法支持链接(并且“用户”包括提供自动完成的IDE)。 根据这个问题和这个问题,通过在支持链接的方法调用结束时返回可以很容易地完成链接。 然而,这些问题都没有解决如何向用户表明一个方法支持链接(除了明显的docstring注释)。如下面的示例代码所示,我试图添加一个类型提示

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,