What is the correct way to subclass asyncio.StreamReader?
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 5.1k
- 派生
- 2.1k
- 平均合并
- 1 天 19 小时
- 30 天内合并 PR
- 82
描述
#11755 changed the signature of asyncio.StreamReader.readuntil to make the separator argument take an internal type _ReaduntilBuffer that just has ... for its definition. This is confusing because inside the python 3.12 stdlib code this argument is already typed as bytes, which is the obvious choice. When I try to write my own subclass that takes bytes for the argument mypy complains I'm violating Liskov. Since this class is specifically designed as a base class that users would want to subclass themselves, it seems like there should be a way to do this that doesn't use internal types, no?
import asyncio
import typing
class StreamReaderWrapper(asyncio.StreamReader):
def __init__(self):
self._reader: asyncio.StreamReader | None = None
@typing.override
async def read(self, n: int = -1) -> bytes:
assert self._reader is not None
return await self._reader.read(n)
@typing.override
async def readline(self) -> bytes:
assert self._reader is not None
return await self._reader.readline()
@typing.override
async def readexactly(self, n: int) -> bytes:
assert self._reader is not None
return await self._reader.readexactly(n)
@typing.override
async def readuntil(self, separator: bytes = b'\n') -> bytes:
assert self._reader is not None
return await self._reader.readuntil(separator)
foo.py:4: error: Argument 1 of "readuntil" is incompatible with supertype "StreamReader"; supertype defines the argument type as "_ReaduntilBuffer" [override]
foo.py:4: note: This violates the Liskov substitution principle
foo.py:4: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
Note that using bytes | bytearray | memoryview as the type instead (taken from #11755) doesn't work either, same error
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
检查 asyncio.StreamReader.readuntil 的 stub 和 Python 3.12 stdlib 实现,从 #11755 修改的签名开始。使用提供的 StreamReaderWrapper 和 mypy 重现 override 错误,然后建立一个公共 annotation,使其允许文档中说明的 subclassing 用例,同时不暴露不适用的内部类型。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- developer-experience
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100