Descriptor protocol is executed for properties returning descriptors
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
Consider this example:
from __future__ import annotations
class X: ...
class Y:
@property
def some_property(self) -> Descriptor: # return Descriptor instance
return Descriptor()
class Descriptor:
def __get__(self, obj: X, cls: type[X]) -> int: # can work only with X instances
print(f'Descriptor.__get__({self}, {obj}, {cls}) called')
return 0
y = Y()
print(y.some_property)
# arg-type: Argument 1 to "__get__" of "Descriptor" has incompatible type "Y"; expected "X"
# arg-type: Argument 2 to "__get__" of "Descriptor" has incompatible type "Type[Y]"; expected "Type[X]"
# stdout: <__main__.Descriptor object at 0x0000020BF8A5BE20>
# note that Descriptor.__get__ isnt called
I am defining descriptor that can work only with X instances, and i am returning this descriptor from property of Y instances.
At runtime Descriptor.__get__ isnt called, but mypy thinks that Y.some_property is Descriptor (not a property returning Descriptor instance), tries to execute descriptor protocol and fails.
At runtime i am getting no errors, descriptor isnt called and this code is safe.
To reproduce:
- just run mypy with this code
Expected Behavior
- no errors
Actual Behavior
- error
Your Environment
- Mypy version used:
mypy 0.971 (compiled: yes) - Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files): none - Python version used: 3.10.6
- Operating system and version: Win10
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 il riproduttore inline con mypy 0.971 e conferma i due errori relativi ai descrittori. Traccia la gestione da parte di mypy delle proprietà i cui valori restituiti implementano descrittori, quindi verifica che l'esempio non produca errori, mentre l'accesso a descrittori effettivi continui a essere controllato.
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