键入可选的静态方法(带或不带参数)



我试图在基类中为None(具有None的文字值)的方法添加类型,但子类可以使用静态方法实现它。到目前为止,我所得到的如下:

class BaseClass:
attr: ClassVar[Optional[Callable[[str], None]]] = None

class ChildClass1(BaseClass):
pass

class ChildClass2(BaseClass):
@staticmethod
def attr(s: str):
return "hello"

这是我所期望的工作,但相反,我的投掷:

test.py:14: error: Signature of "attr" incompatible with supertype "BaseClass"  [override]

有趣的是,如果函数没有参数,它可以工作:

class BaseClass:
attr: ClassVar[Optional[Callable[[], None]]] = None

class ChildClass2(BaseClass):
@staticmethod
def attr():
return "hello"

一个非常简单的解决方法是用不同的名称定义方法,然后为它分配attr:

from typing import ClassVar, Callable, Optional
class BaseClass:
attr: ClassVar[Optional[Callable[[str], str]]] = None

class ChildClass1(BaseClass):
pass

class ChildClass2(BaseClass):
@staticmethod
def _attr(s: str) -> str:
return "hello"
attr = _attr

我的猜测是mymyy只是有一个小错误,它没有处理这个特殊的边缘情况,一个attr只在一些实现中定义为一个方法。我以前从未见过这种模式——它似乎违背了定义基本接口的目的,但也许看到现实世界的用例会使它对我更有意义。

最新更新