web-dev-qa-db-fra.com

Tapez hinting / annotation (PEP 484) pour numpy.ndarray

Quelqu'un a-t-il implémenté une indication de type pour la classe numpy.ndarray spécifique?

En ce moment, j'utilise typing.Any , mais ce serait bien d'avoir quelque chose de plus spécifique.

Par exemple, si les gens numpy ont ajouté un type alias pour leur classe d'objets array_like . Mieux encore, implémentez la prise en charge au niveau dtype , afin que d'autres objets soient pris en charge, ainsi que func .

40
Inon

Il semble que le module typing ait été développé à:

https://github.com/python/typing

Le référentiel principal numpy est à

https://github.com/numpy/numpy

Les bugs et commits de Python peuvent être suivis sur

http://bugs.python.org/

La manière habituelle d'ajouter une fonctionnalité est de bifurquer le référentiel principal, de développer la fonctionnalité jusqu'à ce qu'elle soit à l'épreuve des bombes, puis de soumettre une demande d'extraction. De toute évidence, à différents moments du processus, vous souhaitez obtenir des commentaires d'autres développeurs. Si vous ne pouvez pas faire le développement vous-même, vous devez convaincre quelqu'un d'autre que c'est un projet valable.

cython a une forme d'annotations, qu'il utilise pour générer un code C efficace.


Vous avez référencé le array-like paragraphe dans la documentation numpy. Notez ses typing informations:

Un moyen simple de savoir si l'objet peut être converti en un tableau numpy en utilisant array () est simplement de l'essayer de manière interactive et de voir si cela fonctionne! (La méthode Python Way).

En d'autres termes, les développeurs numpy refusent d'être épinglés. Ils ne décrivent pas ou ne peuvent pas décrire en mots quels types d'objets peuvent ou ne peuvent pas être convertis en np.ndarray.

In [586]: np.array({'test':1})   # a dictionary
Out[586]: array({'test': 1}, dtype=object)

In [587]: np.array(['one','two'])  # a list
Out[587]: 
array(['one', 'two'], 
      dtype='<U3')

In [589]: np.array({'one','two'})  # a set
Out[589]: array({'one', 'two'}, dtype=object)

Pour vos propres fonctions, une annotation comme

def foo(x: np.ndarray) -> np.ndarray:

travaux. Bien sûr, si votre fonction finit par appeler une fonction numpy qui passe son argument par asanyarray (comme beaucoup le font), une telle annotation serait incomplète, car votre entrée pourrait être une list, ou np.matrix, etc.


Lors de l'évaluation de cette question et réponse, faites attention à la date. 484 était un PEP relativement nouveau à l'époque, et le code pour l'utiliser pour le standard Python toujours en développement. Mais il semble que les liens fournis soient toujours valides.

17
hpaulj

Découvrez DataShape . Il utilise les types de données ainsi qu'une certaine syntaxe pour déterminer la taille des tableaux d'entrée et de sortie.

5
Back2Basics

Ce que j'ai fait, c'était de le définir comme

Dict [Tuple [int, int], TYPE]

Ainsi, par exemple, si vous voulez un tableau de flotteurs, vous pouvez faire:

a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]

Ce n'est bien sûr pas exact du point de vue de la documentation, mais pour analyser une utilisation correcte et obtenir une exécution correcte avec pyCharm, cela fonctionne très bien!

4
Leon Vayman