Descriptor protocol is executed for properties returning descriptors
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 54
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza ejecutando el reproductor en línea con mypy 0.971 y confirma los dos errores relacionados con descriptores. Rastrea cómo mypy gestiona las propiedades cuyos valores de retorno implementan descriptores y, a continuación, verifica que el ejemplo no produzca errores, mientras el acceso a descriptores reales siga comprobándose.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100