python / python/mypy

False positive in case of custom __setattr__ that changes the type of the attribute

Offen
#13,071 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

feature
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

I have a class with a custom __setattr__(self, attr, value:TYPE). This method converts value to another type.
I am getting false positives, since mypy assumes that for each particular TYPE, type(getattr(obj, attr)) == TYPE.

To Reproduce
Minimal code example:

from typing import *

class Context:
    def __setattr__(self, attr:str, value:Any):
        super().__setattr__(attr, str(value))

ctx = Context()
ctx.a = 10
print(len(ctx.a))

Actual Behavior

mypy output

....py:9: error: "Context" has no attribute "a"
....py:9: error: Argument 1 to "len" has incompatible type "int"; expected "Sized"

I would like to tell mypy that for this class, it mustn't assume that type(getattr(ctx, "a")) == type(10) .

Your Environment

  • mypy 0.961 (compiled: yes) on Ubuntu Linux (Jupyter Docker image)
  • Python 3.8.10 (Anaconda)

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 damit, das minimale Context-Beispiel mit mypy auszuführen und die gemeldeten Fehler mit dem im Issue beschriebenen erwarteten Verhalten zu vergleichen. Verfolge den Type-Checking-Pfad für benutzerdefiniertes setattr und inferierte Attribute; abgeschlossen ist die Aufgabe, wenn das Beispiel keine False Positives mehr für den konvertierten Attributtyp erzeugt.

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

Neue Issues direkt in Ihr Postfach

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