我有一个带有以下签名的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):
...
假设现在有两个类DerivedA
和ctrl
0都继承自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.Control
0派生的任何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_sizer
为ctrl
提供了一个参数,而该参数实际上不是wx.Control
的实例 wxPython
把打字搞砸了- PyCharm的静态类型检查器中有一个错误
如果您通过PyCharm提供产生PyCharm投诉和特定消息的代码,我们可以解决这个问题。
PS:
如果PyCharm抱怨发生在其他地方,因为您假设ctrl
具有某些它可能没有的属性,这可能表明您实际上需要它成为特定子类的实例。根据具体情况,有多种方法可以处理此问题。