Uh oh!
There was an error while loading. Please reload this page.
typing: accept buffers in typing.IO.write - #9084
Conversation
JelleZijlstra
commented
Nov 4, 2022
The mypy failures are a bug, python/mypy#14002. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
srittau
commented
Nov 4, 2022
This looks quite disruptive to me and I'm not sure whether it's worth it, considering the slightly legacy nature of |
JelleZijlstra
commented
Nov 4, 2022
Worth noting that most of the mypy-primer fallout is due to a mypy bug (python/mypy#14002). |
hauntsaninja
commented
Nov 5, 2022
This seems useful, but given that I think I have a mypy fix, let's wait until it's released: python/mypy#14017 |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
AlexWaygood
left a comment
There was a problem hiding this comment.
Looks like we can go back to this now, with the latest mypy release!
| def __iter__(self: Self) -> Self: ... | ||
| def write(self, data: str) -> None: ... # type: ignore[override] | ||
| def writelines(self, list: Iterable[str]) -> None: ... | ||
| def writelines(self, list: Iterable[str]) -> None: ... # type: ignore[override] # https://github.com/python/mypy/issues/14002 |
There was a problem hiding this comment.
We probably don't need this type: ignore anymore (as well as several others), with the latest mypy release.
There was a problem hiding this comment.
Cleaned up all comments referencing that issue.
| def parse_headers(fp: io.BufferedIOBase, _class: Callable[[], email.message.Message] = ...) -> HTTPMessage: ... | ||
| class HTTPResponse(io.BufferedIOBase, BinaryIO): | ||
| class HTTPResponse(io.BufferedIOBase, BinaryIO): # type: ignore[misc] # https://github.com/python/mypy/issues/14002 |
There was a problem hiding this comment.
We do still need this type: ignore, but not because of the mypy issue linked (which is now closed) -- we need it because the definitions of writelines() in the two base classes are incompatible. The same goes for all the type: ignores in io.pyi and the one in lzma.pyi.
There was a problem hiding this comment.
Updated these comments.
| @overload | ||
| def write(self: _TemporaryFileWrapper[str], s: str) -> int: ... | ||
| @overload | ||
| def write(self: _TemporaryFileWrapper[bytes], s: ReadableBuffer) -> int: ... | ||
| @overload | ||
| def writelines(self: _TemporaryFileWrapper[str], lines: Iterable[str]) -> None: ... | ||
| @overload | ||
| def writelines(self: _TemporaryFileWrapper[bytes], lines: Iterable[ReadableBuffer]) -> None: ... |
There was a problem hiding this comment.
There was a problem hiding this comment.
Changed, and added some testcases for IO.write.
This comment has been minimized.
This comment has been minimized.
AlexWaygood
commented
Mar 9, 2023
Ping @JelleZijlstra, have you had a chance to take a look at my review feedback? :) |
JelleZijlstra
commented
Mar 9, 2023
Oops, I think I assumed this was still blocked. I will take a look soon! |
This comment has been minimized.
This comment has been minimized.
JelleZijlstra
commented
Mar 10, 2023
hm, the new way to write the overloads makes subclassing much worse. Let me see if I can fix that. |
This comment has been minimized.
This comment has been minimized.
Diff from mypy_primer, showing the effect of this PR on open source code: rich (https://github.com/Textualize/rich)
+ rich/progress.py:173: error: Definition of "writelines" in base class "IOBase" is incompatible with definition in base class "IO" [misc]
psycopg (https://github.com/psycopg/psycopg)
+ psycopg/psycopg/copy.py:464: error: Unused "type: ignore" comment
cwltool (https://github.com/common-workflow-language/cwltool)
+ cwltool/main.py:963: error: Unused "type: ignore[arg-type]" comment |
JelleZijlstra
commented
Mar 10, 2023
Seems like we have a choice between:
I'm inclined to go with (1) because mypy's behavior is more clearly buggy than pyright's, but ideally we'd fix the mypy bug first. |
AlexWaygood
commented
Mar 12, 2023
Now that python/mypy#14882 has been merged, I guess we have two options:
I'm easy either way :) |
Fixes#9082