Skip to content

Regression: IO[str] not compatible with SupportsWrite[AnyStr] #17863

Closed

Description

@JukkaL

This code generates a false positive, but type checked cleanly on mypy 1.11:

from typing import IO
from shutil import copyfileobj

f: IO[str]
copyfileobj(f, f)  # Cannot infer type argument 1 of "copyfileobj"

I believe the reason is that the definition of IO.write changed in typeshed, and this triggered a mypy bug. Here's how IO.write is currently defined:

class IO(Iterator[AnyStr]):
    ...
    @abstractmethod
    @overload
    def write(self: IO[bytes], s: ReadableBuffer, /) -> int: ...
    @abstractmethod
    @overload
    def write(self, s: AnyStr, /) -> int: ...

Activity

  1. self-assigned this
    on Oct 2, 2024
  2. JukkaL commented on Oct 2, 2024

    @JukkaL
    CollaboratorAuthor

    Self-contained test case:

    from typing import TypeVar, Generic, Protocol, overload
    
    T_contra = TypeVar("T_contra", contravariant=True)
    AnyStr = TypeVar("AnyStr", str, bytes)
    
    class SupportsWrite(Protocol[T_contra]):
        def write(self, s: T_contra, /) -> None: ...
    
    class Buffer: ...
    
    class IO(Generic[AnyStr]):
        @overload
        def write(self: IO[bytes], s: Buffer, /) -> None: ...
        @overload
        def write(self, s: AnyStr, /) -> None: ...
        def write(self, s): ...
    
    def foo(fdst: SupportsWrite[AnyStr]) -> None: ...
    
    x: IO[str]
    foo(x)  # Value of type variable "AnyStr" of "foo" cannot be "Buffer"

    It looks like we are picking up constraints from the wrong overload item.

  3. hauntsaninja commented on Oct 2, 2024

    @hauntsaninja
    Collaborator

    Related: #15031

  4. added a commit that references this issue on Oct 3, 2024
    3c09b32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions