python / python/mypy

`functools.reduce` over sets becomes unacceptable when used in a larger expression

Offen
#17,694 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-type-context
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Reproducer:

from typing import Collection
from functools import reduce


def _pull_out_loop_nest(
            loop_nests: list[frozenset[str]],
            inames_to_pull_out: frozenset[str]
        ) -> None:
    emptyset: frozenset[str] = frozenset()

    # OK
    reduce(frozenset.union, loop_nests[:-1], emptyset)

    # Error
    inames_to_pull_out - reduce(frozenset.union, loop_nests[:-1], emptyset)

Here is what mypy says as of 1.11.1:

mypybug.py:15: error: Argument 1 to "reduce" has incompatible type "Callable[[frozenset[_T_co], VarArg(Iterable[_S])], frozenset[_T_co | _S]]"; expected "Callable[[AbstractSet[str], frozenset[str]], AbstractSet[str]]"  [arg-type]

This seems spurious: It's not clear to me why this should be acceptable as a stand-alone expression, but not within a larger expression. Pyright (1.1.376) also seems to like this code just fine.

See also #17693.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere die Diagnose aus dem in mypybug.py gezeigten Code und vergleiche den eigenständigen reduce-Aufruf mit demselben Aufruf, der im Ausdruck für die Mengendifferenz verwendet wird. Verfolge, wie mypy functools.reduce in diesem Kontext ableitet und prüft; abgeschlossen ist die Aufgabe, wenn der gültige Ausdruck akzeptiert wird, ohne die Fehlerprüfung für tatsächlich inkompatible reduce-Aufrufe abzuschwächen.

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
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.