python / python/mypy

Lambda as RHS for operator always gets inferred as Any

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

Dieses Issue hat noch niemand übernommen.

bug priority-2-low topic-disallow-any
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

When a lambda is given as the RHS in an operator (example uses >>, but also occurs with others), the lambda’s type is always inferred as Any. Whereas calling the operator function directly, or passing an explicit function, does not.

from typing import Callable, Generic, TypeVar

_T = TypeVar('_T')
_U = TypeVar('_U')

class A(Generic[_T]):
    _value: _T
    def __init__(self, val: _T) -> None: ...
    def __rshift__(self, f: Callable[[_T], _U]) -> _U: ...

def inc(x: int) -> int: ...

A(1) >> inc  # No error
A(1).__rshift__(lambda x: x + 1)  # No error
A(1) >> (lambda x: x + 1)
#        │         └ Expression has type "Any"
#        └ Expression type contains "Any" (has type Callable[[Any], Any])
  • Python 3.7.0
  • mypy 0.641
  • mypy config:
    [mypy]
    check_untyped_defs = True
    disallow_any_decorated = True
    disallow_any_expr = True
    disallow_any_unimported = True
    disallow_incomplete_defs = True
    disallow_subclassing_any = True
    disallow_untyped_calls = True
    disallow_untyped_decorators = True
    disallow_untyped_defs = True
    warn_return_any = True
    warn_unused_ignores = True
    

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 die bereitgestellte Python-Reproduktion mit der angegebenen mypy-Konfiguration aus und vergleiche die Operatorform mit dem direkten Methodenaufruf und der benannten Funktion. Verfolge die Typinferenz des Operatorausdrucks von diesem Einstiegspunkt aus; abgeschlossen ist die Aufgabe, wenn die eingeklammerte Lambda-Funktion aus dem Operandentyp inferiert wird, statt Any zu erzeugen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

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