有没有人为特定的numpy.ndarray
类实现类型提示?
现在,我正在使用typing.Any
,但是最好有更具体的内容。
例如,如果NumPy人们为其array_like对象类添加了类型别名。更好的是,在dtype级别实现支持,以便支持其他对象以及ufunc。
有没有人为特定的numpy.ndarray
类实现类型提示?
现在,我正在使用typing.Any
,但是最好有更具体的内容。
例如,如果NumPy人们为其array_like对象类添加了类型别名。更好的是,在dtype级别实现支持,以便支持其他对象以及ufunc。
typing
是Py 3.5的新功能。许多numpy
用户仍在使用Py2。我的系统上有3.5,但尚未numpy
安装。 numpy
开发人员不会为Python的最先进功能(@
运算符除外)添加功能
numpy
在github
存储库上维护。看issues
和pull requests
; 注册并提交您自己的问题。可能会有另一个论坛来讨论开发问题,但我大多数都关注这些github
问题。
Answers:
看起来typing
模块是在以下位置开发的:
https://github.com/python/typing
主numpy
存储库位于
https://github.com/numpy/numpy
可以在以下位置跟踪Python错误和提交:
添加功能的通常方法是派生主存储库,开发功能直至防炸弹,然后提交拉取请求。显然,在此过程的各个阶段,您都需要其他开发人员的反馈。如果您不能自己进行开发,则必须说服其他人,这是一个有价值的项目。
cython
具有一种注释形式,可用于生成有效的C
代码。
您引用了文档中的array-like
段落numpy
。注意其typing
信息:
查找是否可以使用array()将对象转换为numpy数组的简单方法是,以交互方式尝试并查看其是否有效!(Python方式)。
换句话说,numpy
开发商拒绝被钉住。他们无法或无法用文字描述可以或不能转换为哪种对象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)
对于您自己的功能,像这样的注释
def foo(x: np.ndarray) -> np.ndarray:
作品。当然,如果您的函数最终调用某个numpy
传递其参数的函数asanyarray
(就像许多人一样),则这样的注释将是不完整的,因为您的输入可能是list
,或np.matrix
,等等。
在评估此问题和答案时,请注意日期。484当时是相对较新的PEP,并且仍在开发中的用于标准Python的代码。但是看起来提供的链接仍然有效。
annotations
?据我所知,在普通的Python 3中,一个函数获取一个__annotations__
字典,但是解释器对此不执行任何操作。
typing
现有numpy
功能(包括np.array
)中添加注释,还是只是将注释添加到自己的函数中的类型?
def Vector(np_arr): return np_arr.ndim == 1 def Matrix(np_arr): return np_arr.ndim > 1
。希望对别人有所帮助。
在我公司,我们一直在使用:
from typing import TypeVar, Generic, Tuple, Union, Optional
import numpy as np
Shape = TypeVar("Shape")
DType = TypeVar("DType")
class Array(np.ndarray, Generic[Shape, DType]):
"""
Use this to type-annotate numpy arrays, e.g.
def transform_image(image: Array['H,W,3', np.uint8], ...):
...
"""
pass
def func(arr: Array['N,2', int]):
return arr*2
print(func(arr = np.array([(1, 2), (3, 4)])))
实际上,我们周围有一个MyPy检查器,用于检查形状是否正常(我们应该在某个时候释放它)。唯一的事情是它并不能使PyCharm开心(即,您仍然会收到讨厌的警告行):
argparse
解析器。对于Py2,它使用装饰器来创建类似的annocation
数据库。