Callable with Iterator[T] return type and default function with compatible return type, errors
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe zunächst das bereitgestellte Python-Snippet mit mypy 0.812 aus und vergleiche den generischen reader-Parameter in foo mit dem Standardwert in baz. Verfolge, wie mypy einen Standard-Callable gegen einen generischen Rückgabetyp prüft. Als erledigt gilt die Aufgabe, wenn baz csv.reader ohne einen Inkompatibilitätsfehler akzeptiert und dabei das bestehende Verhalten für foo erhalten bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100