在派生类的重写方法中键入一个可选的命名参数

问题描述

在运行时,以下代码完全有效:

class Base():
    @abstractmethod
    def get(self,arg: str,**kwargs: Any):
        pass

class Derived(Base):
    def get(self,optional_arg: bool = False,**kwargs: Any):
        pass

这样做的好处在于,在静态分析期间,如果您碰巧知道您有一个类型为 Derived 的变量,您将获得额外的奖励,即发现可选的命名参数 optional_arg 及其类型。

我认为 Derived 在这里以兼容的方式覆盖 get,但是,PyRight 说覆盖是不兼容的:

Method "get" overrides class "Base" in an incompatible manner
  Parameter 3 type mismatch: base parameter is type "Any",override parameter is type "bool"
PylancereportIncompatibleMethodoverride

尝试使用 overload 装饰器对我来说也失败了,所以我相信我也没有正确使用它:

class Derived(Base):
    @overload
    def get(self,path: Path,local_path: Path,is_directory: bool = False):
        ...

    def get(self,**kwargs: Any):
        pass

给予:

"get" is marked as overload,but additional overloads are missing
PylancereportGeneralTypeIssues

Overloaded function implementation is not consistent with signature of overload 1
  Type "(self: Derived,**kwargs: Any) -> None" cannot be assigned to type "(self: Derived,optional_arg: bool = False) -> None"
    Function accepts too many positional parameters; expected 2 but received 3
PylancereportGeneralTypeIssues

有没有一种正确的方法来输入注释我想要实现的目标?即基类抽象方法对派生类的可选参数的名称和类型一无所知,但派生类可以公开特定的命名参数及其类型。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...