Issue inferring type with circular imports/future annotations
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
Hey! I ran into something which I think is a bug, although its a very small use case and can be fixed pretty easily. This is my first time reporting an issue so let me know if I need to supply anything more info, or if this isn't actually a bug
Bug Report
using future annotations with this circular import seems to cause issues with recognizing types
To reproduce:
create the following structure:
src
├──my_directory
├── __init__.py
├──a.py
├──__init__.py
├──b.py
with the following code in the files:
src/my_directory/init.py:
from .a import OBJECT_FACTORY, Object
src/my_directory/a.py
from .. import b
class Object():
pass
class ObjectFactory:
def make_object(self) -> Object:
pass
OBJECT_FACTORY = ObjectFactory()
src/init.py
# empty file
src/b.py
from __future__ import annotations
from . import my_directory
def func(bar: Bar):
print(bar.object)
class Bar:
def __init__(
self,
_: str, # if you delete this type annotation there will no longer be an error
):
self.object = my_directory.OBJECT_FACTORY.make_object()
then run:
mypy src
Expected Behavior:
Should be able to infer that the type of bar.object is Object from the type annotation of the make_object method.
Actual Behavior
src/b.py:5: error: Cannot determine type of "object"
Found 1 error in 1 file (checked 4 source files)
Some interesting behaviors:
- if you delete the str type annotation in the Bar class, mypy passes with no issues
- defining func after Bar class passes with no issues
- deleting the 'from .. import b' in a.py passes with no issues
- using a static function make_object with the same annotation instead of in OBJECT_FACTORY will pass with no issues
- running mypy src/b.py instead of mypy src will pass with no issues
- subsequently, now running mypy src will actually pass without issues (likely due to .mypy_cache, deleting the cache will re-instate the bug)
- you can fix this issue if you add the type annotation my_directory.Object to self.object in class Bar
My Environment:
mypy --version
mypy 0.960 (compiled: yes)
python --version
Python 3.8.6
- Mypy command-line flags: no flags
- OS: Windows 10
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 informe usando los archivos de src/my_directory/a.py, src/b.py y los archivos init.py del paquete; después, ejecute mypy src con la caché eliminada. Compare el comportamiento cuando se cambien la anotación del constructor, la importación circular o future annotations. Se considera terminado cuando el ejemplo indicado infiere bar.object como Object sin añadir una anotación redundante y sigue sin informar de errores.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- tooling
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100