Annotate function which return a specific module (e.g. `-> Literal[np]`)
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 1.8k
- Forks
- 302
- Merge medio
- 23 h
- PR fusionados (30 d)
- 8
Descripción
Problem
Currently it's not possible to annotate a function which return a specific module, like:
np = load_numpy() # def load_numpy() -> ??:
x = np.array(123) # << I want to have auto-complete & type checking here
-> types.ModuleTypedoes not work as too generic (no auto-complete, nor static type checking,...)Protocolis not applicable in practice: maintaining a numpy protocol which has 500+ symbols is just not realistic
Use case
Here are some concrete use-case where this feature is needed (also collected from this thread comments):
-
Numpy Enancement Propopsal 37 propose a recipe to have code working with various numpy implementation (
numpy,jax.numpy,tensorflow.numpy):def duckarray_add_random(array): module = np.get_array_module(array) # def get_array_module() -> Literal[np] noise = module.random.randn(*array.shape) # << I want to have auto-complete & type checking here return array + noiseI developed my version at https://github.com/google/etils/tree/main/etils/enp#code-that-works-with-nparray-jnparray-tftensor
-
Lazy imports is a common pattern to only import a module if needed. Like: https://github.com/tensorflow/datasets/blob/76f8591def26afaca16340b06d057553582f6163/tensorflow_datasets/core/lazy_imports_lib.py#L40-L197
beam = lazy_import.apache_beam beam.Pipeline() # << No auto-completion -
From another user comment: Similar issue to to 1. encountered at: https://github.com/data-apis/array-api/issues/267
-
From another user comment:
I encountered a similar issue before. Although not with with the return type but rather version dependent imports, e.g. assign either ast (Py >= 3.8) or typed_ast.ast3 to a common variable.
Proposal
I would like to annotate my function as:
def load_numpy() -> Literal[np]:
Or:
def load_numpy() -> np:
For the lazy-loading case, typing.TYPE_CHECKING pattern could be used:
if typing.TYPE_CHECKING:
import numpy as np
def load_numpy() -> Literal[np]:
import numpy as np
return np
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
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 con la Proposal y los ejemplos enlazados de importaciones de NumPy, lazy-import y dependientes de la versión; después, revisa la discusión existente sobre typing issue. No se nombra ningún archivo de implementación ni ninguna prueba; se considera terminado cuando se especifican la forma admitida de expresar un retorno cuyo valor es un módulo y su comportamiento de autocompletado y comprobación de tipos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- tooling
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100