`isinstance` check with nested `Protocol`.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 1.8k
- Forks
- 302
- Ø Merge
- 23 Std.
- Gemergte PRs (30 T.)
- 8
Beschreibung
isinstance(obj, ProtocolSubclass) only checks the the existence of ProtocolSubclass's methods on obj and not the type signature. To provide deeper checks, maybe isinstance could check attributes/methods on ProtocolSubclass that are themselves a Protocol.
A small example showing the change in behavior:
@runtime_checkable
class FooLike(Protocol):
attr: str
@runtime_checkable
class BarLike(Protocol):
attr: FooLike
@dataclass
class Foo:
attr: str = "test"
@dataclass
class Bar:
attr: Foo
foo = Foo()
bar = Bar(foo)
# No change in current behavior
assert isinstance(foo, FooLike) # passes
assert isinstance(bar, BarLike) # passes
assert isinstance(bar, FooLike) # passes
# Change in behavior
assert not isinstance(foo, BarLike) # NOT because `BarLike.attr` should be `FooLike` and `foo.attr` is not
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
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
Beginnen Sie mit dem Laufzeitverhalten von isinstance(obj, ProtocolSubclass) und den @runtime_checkable Protocol-Beispielen im Bericht. Vergleichen Sie die aktuellen flachen Prüfungen auf Attributvorhandensein mit dem angeforderten Verhalten verschachtelter Protocols und verwenden Sie anschließend die assertions im Beispiel, um den Abschluss zu definieren.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- tooling
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100