python / python/typeshed

Should `callable` narrow to `TypeIs[Callable[..., object]]` or `TypeIs[Callable]` ?

Offen
#16,050 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
5.1k
Forks
2.1k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
82

Beschreibung

Currently, typeshed annotates

def callable(obj: object, /) -> TypeIs[Callable[..., object]]: ...

However, for the majority of type checkers this creates discrepancy between collections.abc.Callable and builtins.callable narrowing, only ty seems to consider blank Callable as if it were Callable[..., object], whereas all other type checkers treat it as Callable[..., Any].

from typing import reveal_type, TypeIs
from collections.abc import Callable

def is_callable(arg: object) -> TypeIs[Callable]:
    raise NotImplementedError

def check_callable(arg: object) -> None:
    if isinstance(arg, Callable):
        reveal_type(arg)
            
def check_callable2(arg: object) -> None:
    if callable(arg):
        reveal_type(arg)
        
def check_callable3(arg: object) -> None:
    if is_callable(arg):
        reveal_type(arg)
case isinstance(x, Callable) is_callable callable(x)
mypy ERROR (...) -> Any <callable subtype of object>
pyright (...) -> Unknown (...) -> Unknown (...) -> object
pyrefly (...) -> Unknown (...) -> Unknown (...) -> object
ty (...) -> object (...) -> Any (...) -> object
zuban ERROR (...) -> Any <callable subtype of object>

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

Beginne mit der Annotation builtins.callable und vergleiche sie mit collections.abc.Callable. Führe die Beispiele anhand der im Issue aufgeführten Verhaltensweisen der Type-Checker aus und prüfe anschließend die Kommentardiskussion, um zu bestimmen, welche Annotation ein konsistentes Narrowing liefert; abgeschlossen ist die Aufgabe, wenn der ausgewählte Stub das beabsichtigte Verhalten über die betroffenen Checker hinweg abbildet.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
developer-experience, tooling
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

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