gh-108411: Make typing.IO/BinaryIO arguments positional-only

`IO` is purported to be the type of the file objects returned by `open`.
However, all methods on those objects take positional-only arguments, while
`IO`'s methods are declared with regular arguments. As such, the file objects
cannot actually be considered to implement `IO`. The same thing applies to
`BinaryIO`.

Fix this by adjusting the definition of these ABCs to match the file objects.

This is technically a breaking change, but it is unlikely to actually break
anything:

* These methods should never be called at runtime, since they are abstract.
  Therefore, this should not cause any runtime errors.

* In typeshed these arguments are already positional-only, so this should
  not cause any errors during typechecking either.
This commit is contained in:
Roman Donchenko 2025-12-17 01:32:52 +02:00
parent 4345253981
commit 41974b828f
2 changed files with 11 additions and 9 deletions

View file

@ -3524,7 +3524,7 @@ class IO(Generic[AnyStr]):
pass
@abstractmethod
def read(self, n: int = -1) -> AnyStr:
def read(self, n: int = -1, /) -> AnyStr:
pass
@abstractmethod
@ -3532,15 +3532,15 @@ class IO(Generic[AnyStr]):
pass
@abstractmethod
def readline(self, limit: int = -1) -> AnyStr:
def readline(self, limit: int = -1, /) -> AnyStr:
pass
@abstractmethod
def readlines(self, hint: int = -1) -> list[AnyStr]:
def readlines(self, hint: int = -1, /) -> list[AnyStr]:
pass
@abstractmethod
def seek(self, offset: int, whence: int = 0) -> int:
def seek(self, offset: int, whence: int = 0, /) -> int:
pass
@abstractmethod
@ -3552,7 +3552,7 @@ class IO(Generic[AnyStr]):
pass
@abstractmethod
def truncate(self, size: int | None = None) -> int:
def truncate(self, size: int | None = None, /) -> int:
pass
@abstractmethod
@ -3560,11 +3560,11 @@ class IO(Generic[AnyStr]):
pass
@abstractmethod
def write(self, s: AnyStr) -> int:
def write(self, s: AnyStr, /) -> int:
pass
@abstractmethod
def writelines(self, lines: list[AnyStr]) -> None:
def writelines(self, lines: list[AnyStr], /) -> None:
pass
@abstractmethod
@ -3572,7 +3572,7 @@ class IO(Generic[AnyStr]):
pass
@abstractmethod
def __exit__(self, type, value, traceback) -> None:
def __exit__(self, type, value, traceback, /) -> None:
pass
@ -3582,7 +3582,7 @@ class BinaryIO(IO[bytes]):
__slots__ = ()
@abstractmethod
def write(self, s: bytes | bytearray) -> int:
def write(self, s: bytes | bytearray, /) -> int:
pass
@abstractmethod

View file

@ -0,0 +1,2 @@
``typing.IO`` and ``typing.BinaryIO`` method arguments are now
positional-only.