批注"Instance of a subclass derived from specific base class"



我有一个带有以下签名的Python方法:

def basic_sizer(self, ctrl):

其中CCD_ 1可以是从CCD_ 2导出的任何wxPython控件。除了之外,是否有特定的Python股票注释来指示这一点

def basic_sizer(self, ctrl: wx.Control):

def basic_sizer(self, ctrl: Union[wx.SpinCtrl, wx.BitmapButton, <other possible controls>]):

我试过

def basic_sizer(self, ctrl: Type[wx.Control]):

正如这里所建议的。官方文档中也介绍了这种方法,但PyCharm不接受它,并标记了不匹配的类型。我不想使用一些PyCharm特定的破解,即使可用。相反,我感兴趣的是Pythontypeing模块是否为这种情况提供了一种通用方法。

抽象

您有一些基类SomeBase。您想要编写和注释一个函数foo,该函数接受一个参数arg。该自变量arg可以是SomeBase的实例或SomeBase的任何子类的实例。这就是你写的:

def foo(arg: SomeBase):
...

假设现在有两个类DerivedActrl0都继承自SomeBase,并且您意识到arg实际上应该只是这些子类中的任何一个子类的实例,并且不是类型的SomeBase(直接(。以下是你的写作方式:

def foo(arg: DerivedA | DerivedB):
...

或者在Python<3.10:中

from typing import Union
def foo(arg: Union[DerivedA, DerivedB]):
...

据我所知,目前没有办法注释arg应该是SomeBase的任何子类的实例,而不是类SomeBase本身的实例。


混凝土

我不熟悉wxPython,但你说你想把ctrl的论点变成

是从wx.Control0派生的任何wxPython控件。

根据文档,wx.Control实际上是一个类。您的语句在ctrl参数是否应被假定为wx.Control任何实例方面仍然不明确。但如果是这样,你会写:

def basic_sizer(self, ctrl: wx.Control):
...

如果您想将其限制为特定的子类,可以使用Union

但这是错误的:

def basic_sizer(self, ctrl: Type[wx.Control]):
...

这意味着ctrl必须是(而不是类的实例(,即wx.Control或其任何子类。当然,除非实际上是你想要的。。。再说一遍,你的说法含糊不清。


不匹配的类型

PyCharm抱怨";不匹配类型";包括:

  • 您调用的方法basic_sizerctrl提供了一个参数,而该参数实际上不是wx.Control的实例
  • wxPython把打字搞砸了
  • PyCharm的静态类型检查器中有一个错误

如果您通过PyCharm提供产生PyCharm投诉和特定消息的代码,我们可以解决这个问题。

PS:

如果PyCharm抱怨发生在其他地方,因为您假设ctrl具有某些它可能没有的属性,这可能表明您实际上需要它成为特定子类的实例。根据具体情况,有多种方法可以处理此问题。

最新更新