In scientific code that deals with mathematical operations, before type annotations, it is common to assume that any mathematical function could take in a numpy array. To be explicit you just add to your docstring that you can take array_like or ndarray (as is conventional in NumFocus project docs).
Today, with type annotations, I am at a lost on how to annotate something as simple as:
import numpy as np
def get_variance_plus_one(sample): # A stupid function, just for example
return 1 + np.var(sample)
What is the proper type for sample?
-
Any | Sequence[Any]: Too generic for numerical math. Does not support numpy arrays -
float | Sequence[float]: Does not support complex number (rare use-case) or numpy arrays. -
number.Number | Sequence[number.Number]: Does not support numpy arrays. -
np.typing.ArrayLike: Too generic so much so that__add__and__mul__aren’t necessary. Look at this Pylance error:Operator "+" not supported for types "ArrayLike" and "ArrayLike" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "_SupportsArray[dtype[Unknown]]" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "_NestedSequence[_SupportsArray[dtype[Unknown]]]" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "bool" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "int" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "float" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "complex" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "str" Operator "+" not supported for types "_SupportsArray[dtype[Unknown]]" and "bytes -
np.typing.NDArray[np.number]: Similar problem toArrayLike -
np.typing.NDArray[np.integer | np.floating | np.complexfloating | ...? ] | number.Number
This is way too verbose and prone to mistakes!
Apologies if this issue is better addressed to NumPy. Feel free to send me a link to the relevant community channel.