Skip to content

Remove IOBase.read and write - #16583

Draft
srittau wants to merge 8 commits into
python:mainfrom
srittau:iobase-read-write
Draft

srittau wants to merge 8 commits into
python:mainfrom
srittau:iobase-read-write

Conversation

@srittau

@srittau srittau commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Originally introduced in #4912, because the docs say:

Even though IOBase does not declare read() or write() because their signatures will vary, implementations and clients should consider those methods part of the interface.

In the PR I said:

The change seems correct to me and the best solution. I am still a bit wary that this might cause unforeseen problems, but the mypy_primer output makes me optimistic. Let's try this an be prepared to revert if it causes problems.

This now seems to be the case, since ty 0.0.87 not very unreasonably complains in sub-classes (see #16551):

write: Override does not accept writes of type (...) -> Any

Since the interface may vary according to the docs, I'm not sure how useful there fields are in any case. Let's first see what primer says.

@srittau

srittau commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

pyrefly now crashes with "Stdlib missing class EllipsisType (while bootstrapping)"???

@github-actions

This comment has been minimized.

@srittau

srittau commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Removing it is probably the wrong approach as primer shows, and since we're likely just going to ignore that error code anyway. But I'll try something different.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

spark (https://github.com/apache/spark)
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:470: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:479: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:488: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:499: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:511: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:523: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:535: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ python/pyspark/sql/streaming/stateful_processor_api_client.py:587: error: Too many arguments for "read" of "_IOBase"  [call-arg]

aiohttp (https://github.com/aio-libs/aiohttp)
+ aiohttp/payload.py:508:22: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ aiohttp/payload.py:508:22: note: See https://mypy.rtfd.io/en/stable/_refs.html#code-call-arg for more info
+ aiohttp/payload.py:532:16: error: Too many arguments for "read" of "_IOBase"  [call-arg]
+ aiohttp/payload.py:532:16: note: Error code "call-arg" not covered by "type: ignore[no-any-return]" comment
- aiohttp/worker.py:79:26: note: See https://mypy.rtfd.io/en/stable/_refs.html#code-call-arg for more info

altair (https://github.com/vega/altair)
+ altair/datasets/_cache.py:232: error: Argument 1 to "load" has incompatible type "IOBase"; expected "SupportsRead[str | bytes]"  [arg-type]
+ altair/datasets/_cache.py:232: note: Following member(s) of "IOBase" have conflicts:
+ altair/datasets/_cache.py:232: note:     Expected:
+ altair/datasets/_cache.py:232: note:         def read(self, int = ..., /) -> str | bytes
+ altair/datasets/_cache.py:232: note:     Got:
+ altair/datasets/_cache.py:232: note:         def read(self) -> Any

operator (https://github.com/canonical/operator)
+ ops/_private/harness.py:3639: error: Argument 1 to "copyfileobj" has incompatible type "IOBase"; expected "SupportsRead[Any]"  [arg-type]
+ ops/_private/harness.py:3639: note: Following member(s) of "IOBase" have conflicts:
+ ops/_private/harness.py:3639: note:     Expected:
+ ops/_private/harness.py:3639: note:         def read(self, int = ..., /) -> Any
+ ops/_private/harness.py:3639: note:     Got:
+ ops/_private/harness.py:3639: note:         def read(self) -> Any
+ ops/_private/harness.py:3862: error: Argument 1 to "copyfileobj" has incompatible type "IOBase"; expected "SupportsRead[Any]"  [arg-type]
+ ops/_private/harness.py:3862: note: Following member(s) of "IOBase" have conflicts:
+ ops/_private/harness.py:3862: note:     Expected:
+ ops/_private/harness.py:3862: note:         def read(self, int = ..., /) -> Any
+ ops/_private/harness.py:3862: note:     Got:
+ ops/_private/harness.py:3862: note:         def read(self) -> Any
+ ops/_private/harness.py:3865: error: Argument 1 to "copyfileobj" has incompatible type "IOBase"; expected "SupportsRead[Any]"  [arg-type]
+ ops/_private/harness.py:3865: note: Following member(s) of "IOBase" have conflicts:
+ ops/_private/harness.py:3865: note:     Expected:
+ ops/_private/harness.py:3865: note:         def read(self, int = ..., /) -> Any
+ ops/_private/harness.py:3865: note:     Got:
+ ops/_private/harness.py:3865: note:         def read(self) -> Any

core (https://github.com/home-assistant/core)
+ homeassistant/components/media_source/local_source.py:158: error: Value of type variable "AnyStr" of "copyfileobj" cannot be "Buffer"  [type-var]
+ homeassistant/components/media_source/local_source.py:158: error: Argument 1 to "copyfileobj" has incompatible type "IOBase"; expected "SupportsRead[Buffer]"  [arg-type]
+ homeassistant/components/media_source/local_source.py:158: note: Following member(s) of "IOBase" have conflicts:
+ homeassistant/components/media_source/local_source.py:158: note:     Expected:
+ homeassistant/components/media_source/local_source.py:158: note:         def read(self, int = ..., /) -> Buffer
+ homeassistant/components/media_source/local_source.py:158: note:     Got:
+ homeassistant/components/media_source/local_source.py:158: note:         def read(self) -> Any

xarray (https://github.com/pydata/xarray)
+ xarray/core/utils.py: note: In function "read_magic_number_from_file":
+ xarray/core/utils.py:769: error: Too many arguments for "read" of "_IOBase"  [call-arg]

urllib3 (https://github.com/urllib3/urllib3)
+ src/urllib3/contrib/emscripten/response.py:163: error: Too many arguments for "read" of "_IOBase"  [call-arg]

@srittau

srittau commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator Author

Let's wait for #16587, which should help with the primer hits.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant