Skip to content

Callable with Iterator[T] return type and default function with compatible return type, errors #10504

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
efagerberg opened this issue May 18, 2021 · 2 comments
Labels
bug mypy got something wrong

Comments

@efagerberg
Copy link

Bug Report

I am trying to add some type hints to a module that takes a filename and reads it with a caller supplied reader (most common csv.reader and csv.DictReader). I noticed when I do not supply a default, mypy is fine, however, when I do, it complains about incompatibility.

To Reproduce

import csv
from typing import Callable, Iterable, Iterator, Text, TypeVar

T = TypeVar('T')

def foo(x: str, reader: Callable[[Iterable[Text]], Iterator[T]]) -> Iterator[T]:
    return reader(x)


# Is fine, resolves to Iterator[List[str]]
x = foo('bar.txt', csv.reader)


# Complains that _reader is not compatible with Iterator[T]
def baz(x: str, reader: Callable[[Iterable[Text]], Iterator[T]] = csv.reader) -> Iterator[T]:
    return reader(x)

When I look at the _reader definition I see

class _reader(Iterator[List[str]]):
    dialect: Dialect
    line_num: int
    if sys.version_info >= (3, 0):
        def __next__(self) -> List[str]: ...
    else:
        def next(self) -> List[str]: ...

So it is a subclass of Iterator[List[str]] which should be compatible with Iterator[T]

Expected Behavior

No mypy error is shown

Actual Behavior

mypy complains about using csv.reader as the default value of the reader argument due to it not matching _reader.

Your Environment

  • Mypy version used: 0.812
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
[mypy]
# Most copied from https://github.com/python/mypy/blob/675ae1afc8a5b0a9a515292c7e9d6bc2a38887be/mypy_self_check.ini
disallow_untyped_calls = True
disallow_untyped_defs = True
disallow_incomplete_defs = True
check_untyped_defs = True
disallow_subclassing_any = True
warn_no_return = True
strict_optional = True
strict_equality = True
no_implicit_optional = True
disallow_any_generics = True
disallow_any_unimported = True
warn_redundant_casts = True
warn_unused_ignores = True
warn_unused_configs = True
show_traceback = True
show_error_codes = True

# Should be removed if we use typehints everywhere
follow_imports = silent
python_version = 3.9

[mypy-memory_profiler.*]
ignore_missing_imports = True
  • Python version used: 3.9.1
  • Operating system and version: Ubuntu 20.10
@efagerberg
Copy link
Author

Possible duplicate of #3737

@posita
Copy link
Contributor

posita commented Aug 2, 2023

I had originally identified a work-around to a similar case in #10854 (comment). Unfortunately, that no longer works, but I was able to devise a new one using None as the default argument. (See #10854 (comment) et seq.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug mypy got something wrong
Projects
None yet
Development

No branches or pull requests

2 participants