Mypy does not correctly understand MemberDescriptors for objects with slots.
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Bug Report
When a Python object uses slots, MemberDescriptors are created for each attribute defined as a slot.
Mypy incorrectly interprets these fields as the type of the slotted value, rather than as a member descriptor.
To Reproduce
class TestObject(object):
__slots__ = ["a", "b"]
a: int
b: str
def __init__(self, a: int, b: str) -> None:
self.a = a
self.b = b
def test() -> None:
x = TestObject(5, "hi")
reveal_type(TestObject.a)
reveal_type(TestObject.b)
reveal_type(x.a)
reveal_type(x.b)
Expected Behavior
Here is what the types actually are based on the python repl.
>>> TestObject
<class '__main__.TestObject'>
>>> x = TestObject(10, "hi")
>>> type(TestObject.a)
<class 'member_descriptor'>
>>> type(TestObject.b)
<class 'member_descriptor'>
>>> type(x.a)
<class 'int'>
>>> type(x.b)
<class 'str'>
Actual Behavior
Mypy output:
12: note: Revealed type is 'builtins.int'
13: note: Revealed type is 'builtins.str'
14: note: Revealed type is 'builtins.int'
15: note: Revealed type is 'builtins.str'
Your Environment
Python 3.8.1
mypy 0.782
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
Comienza con la reproducción proporcionada de slots y MemberDescriptor y, después, sigue cómo mypy determina los tipos revelados para los atributos de clase frente a los atributos de instancia. Confirma la corrección comprobando que TestObject.a y TestObject.b se reportan como descriptores de miembro, mientras que x.a y x.b siguen siendo int y str.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- 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