python / python/mypy

Unsupported converter, only named functions, types and lambdas are currently supported with higher-order function

Offen
#15,736 5 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-attrs
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
Ø Merge
1 T. 18 Std.
Gemergte PRs (30 T.)
54

Beschreibung

Bug Report

Mypy succeeds evaluating an attr converter that is an (Any) -> Any function, but fails to evaluate a converter that is returned by a higher-order function that returns an (Any) -> Any function.

To Reproduce

This works as expected:

from attr import define, field


def truncate(val):
    return val[:40]


@define
class Person:
    first_name: str = field(converter=truncate)
    last_name: str = field(converter=truncate)


reveal_type(truncate)

Output:

scratch.py:14: note: Revealed type is "def (val: Any) -> Any"
Success: no issues found in 1 source file

But this does not:

from collections.abc import Callable
from typing import Any

from attr import define, field


def truncate(length) -> Callable[[Any], Any]:
    def truncate_converter(val):
        return val[:length]

    return truncate_converter


@define
class Person:
    first_name: str = field(converter=truncate(40))
    last_name: str = field(converter=truncate(80))


reveal_type(truncate(40))
reveal_type(truncate(80))

Expected Behavior

Output:

scratch.py:20: note: Revealed type is "def (Any) -> Any"
scratch.py:21: note: Revealed type is "def (Any) -> Any"
Success: no issues found in 1 source file

Actual Behavior

Output:

scratch.py:16: error: Unsupported converter, only named functions, types and lambdas are currently supported  [misc]
scratch.py:17: error: Unsupported converter, only named functions, types and lambdas are currently supported  [misc]
scratch.py:20: note: Revealed type is "def (Any) -> Any"
scratch.py:21: note: Revealed type is "def (Any) -> Any"
Found 2 errors in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.4.1
  • Mypy command-line flags: just the file name, no extra flags.
  • Mypy configuration options from mypy.ini (and other config files):
    [tool.mypy]
    platform = "linux"
    python_version = "3.10"
    
  • Python version used: 3.10.12

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

Führe zunächst den bereitgestellten Python-Reproducer mit mypy 1.4.1 aus und bestätige die Fehler bei den beiden Verwendungen von attr-Konvertern. Verfolge die Behandlung von attr-Feldkonvertern für benannte Funktionen im Vergleich zu den von truncate zurückgegebenen Funktionen und füge anschließend einen Regressionstest hinzu, der beide Aufrufe abdeckt. Als erledigt gilt die Aufgabe, wenn die höherwertigen Konverter ohne Fehler akzeptiert werden und die aufgelösten Callable-Typen weiterhin wie gezeigt aussehen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

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