程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python Protocol using keyword-only arguments requires implementation to have different signature

发布于2025-01-02 16:57     阅读(348)     评论(0)     点赞(16)     收藏(0)


I'm on python 3.10. I'm using PyCharm's default type checker and MyPy. Here is the protocol I defined:

class OnSubscribeFunc(Protocol):
    def __call__(self, instrument: str, *, x: int) -> AsyncGenerator:
        ...

When create a method that implements it like this:

class A:
    async def subscribe(self, instrument: str, *, x: int):
        yield ...
a: OnSubscribeFunc = A().subscribe  # this apparently is where it gets it wrong

I get this warning: Expected type 'OnSubscribeFunc', got '(instrument: str, Any, x: int) -> AsyncGenerator' instead

If I remove the * from my implementation however, the warning disappears. I would expect it to be the other way around because not having the * allows the implementation to have non-keyword-only arguments which might not be what I'm aiming for with my protocol.

So for comparison - this implementation gives no warning:

class A:
    async def subscribe(self, instrument: str, x: int):
        yield ...

This does not make any sense to me, why does it behave like this and is this expected or is it a bug in my type checker?


解决方案


This is a known bug of PyCharm. Mypy and Pyright both accept your code as it is.

Put a # type: ignore or # noqa there and move on.



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2046698/df9f015085bc1f8960b5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)