Calling a method of Union of two classes with class's attribute results in incompatible type error
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
Honestly didn't know how to name this issue...
Issue type: Bug
Problematic code:
from typing import Union
class UserTypeA: ...
class UserTypeB: ...
class A:
def permissions_for(self, user: UserTypeA) -> bool: ...
@property
def me(self) -> UserTypeA: ...
class B:
def permissions_for(self, user: UserTypeB) -> bool: ...
@property
def me(self) -> UserTypeB: ...
def func(x: Union[A, B]) -> bool:
return x.permissions_for(x.me)
Error message:
main.py:20: error: Argument 1 to "permissions_for" of "A" has incompatible type "Union[UserTypeA, UserTypeB]"; expected "UserTypeA"
main.py:20: error: Argument 1 to "permissions_for" of "B" has incompatible type "Union[UserTypeA, UserTypeB]"; expected "UserTypeB"
Expected behaviour:
No error as x.me matches the type expected by x.permissions_for - if instance of A is passed x.me will have type UserTypeA and x.permissions_for will expect UserTypeA and same for instance of B.
Also, if func looks like this, the errors are gone so if mypy could infer this without isinstance it would be great:
def func(x: Union[A, B]) -> bool:
if isinstance(x, A):
return x.permissions_for(x.me)
else:
return x.permissions_for(x.me)
Python version:: 3.8.1
Mypy version: 0.761, occurs on master as well
Mypy flags: No flags
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
Reproduce el ejemplo mínimo de main.py con mypy 0.761 o el master actual, centrándote en la llamada Union[A, B] a través de x.permissions_for(x.me). La tarea estará terminada cuando func pase la comprobación de tipos sin isinstance cuando la propiedad de cada clase coincida con el parámetro de su método, mientras que las llamadas realmente incompatibles sigan produciendo errores.
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
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 35/100