下面的代码首先定义协议Proto,然后定义一个函数,该函数接受遵循该协议的变量.然后定义类AB,我认为它们都遵循协议,尽管只有参数名B.__call__与协议不同(在Proto中是x,在B中是y).

在使用mypy判断以下代码后,出现以下错误

main.py:20: error: Argument 1 to "func" has incompatible type "B"; expected "Proto"

似乎,协议不仅强制类型,而且还强制参数名称.这是故意的行为吗?或者是Mypy出了什么问题?

from typing import Protocol

class Proto(Protocol):

    def __call__(self, x: int) -> int:
        ...

def func(f: Proto):
    pass

class A:
    def __call__(self, x: int) -> int:
        return x

class B:
    def __call__(self, y: int) -> int:
        return y

func(A())
func(B())

推荐答案

你可以拨打Proto-p作为p(0)p(x=0).B不能满足第二个条件.如果希望B有效,可以强制使用位置参数

class Proto(Protocol):
    def __call__(self, x: int, /) -> int:
        ...

Python-3.x相关问答推荐

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

重复数组直到一定长度 groupby pandas

如何提高 snowpark 程序的性能?

Pandas 窗口聚合两个排序表

提高时间复杂度的一些建议

合并问卷中多列中的稀疏问题 - Pandas

如何在 on_ready 事件中使用 change_presence? (discord.py)

找到操作系统的图片文件夹的 CLI

删除重复项,但将值相加为一

Pytorch:图像标签

python tkInter 浏览文件夹按钮

使用 distutils 分发预编译的 python 扩展模块

如何为 Python 中的线程设置异步事件循环?

如何等待 create_task() 创建的任务完成?

try 在 Mac OS 中运行此命令pipenv install requests时出错

从 csv 中删除单行而不复制文件

python - Pandas - Dataframe.set_index - 如何保留旧的索引列

Python 2 与 Python 3 - urllib 格式

如何创建一个永远在其上运行滚动协程的事件循环?