False positive in case of custom __setattr__ that changes the type of the attribute
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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)
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia eseguendo l’esempio minimo di Context con mypy e confronta gli errori segnalati con il comportamento previsto descritto nell’issue. Traccia il percorso del controllo dei tipi per setattr personalizzato e gli attributi inferiti; il lavoro è completato quando l’esempio non produce più falsi positivi per il tipo di attributo convertito.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- devtools
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100