python 存根_python - 内联类型注释与存根会导致不同的mypy行为 - SO中文参考 - www.soinside.com...

作为警告,我不清楚您的代码到底是什么样子。您定义了mypy的几个不同版本,但我不确定要尝试继承哪个版本–您的问题缺少Foo。

但是我猜您正在尝试做这样的事情?

如果是这样,问题是根据基类的签名,这样做是合法的,因为class Foo:

def bar(self, *baz: float) -> str:

raise NotImplementedError

class SubFoo(Foo):

def bar(self, baz: float) -> str:

pass被定义为接受可变数量的参数。Foo.bar(...)

但是,如果我们尝试使用您的子类代替Foo,则此代码将失败,因为它仅接受一个参数。

这种认为子类应该始终能够代替父类而不引起类型错误并且不违反代码的现有前提条件和后置条件的想法被称为f = Foo()

f.bar(1, 2, 3, 4, 5, 6, 7, 8)。

但是在那种情况下,为什么要进行以下类型检查?

这是因为由于父类型的签名是class Foo:

bar: Callable[..., str]

class SubFoo(Foo):

def bar(self, baz: float) -> str:

pass,因此mypy实际上最终完全跳过了对函数参数的检查。 Callable[..., str]基本上是在说“请不要打扰检查与我的参数有关的任何内容”。

有点类似于使用...类型使动态类型与静态类型混合使用。同样,Any使您可以使用动态/不确定的签名来表示可调用项。

与以下程序进行对比:Callable[..., str]

[与上一个程序不同,此程序执行not类型检查-尽管class Foo:

def bar(self, *args: Any, **kwargs: Any) -> str:

pass

class SubFoo(Foo):

def bar(self, baz: float) -> str:

pass仍可以接受任何参数,但这种情况下参数的“结构”不灵活,mypy现在会坚持要求您子类还必须能够接受任意数量的参数。

最后,重要的一点是,此行为与是否在存根中定义了类型提示无关。相反,这全都取决于您的函数的实际类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值