Python 3.6 类型检查 : numpy arrays and use defined classes

标签 python python-3.6 typechecking

我想这已经被问过了,但我找不到它

如何在 Python 3.6 中检查非内置类型?

例如,假设我想要一个函数 foo(),它将一个 numpy 数组作为 arg,并返回我的类 Bah 的一个实例

def foo(a: np.array) -> Bah

我可以这样做吗?如何将这些类型添加到检查中?

最佳答案

如果类型的名称在范围内(例如,您在当前文件中定义了 Bob,或者完成了 from stuff import Bob`),您可以指定任何您想要的作为类型注释。

一般来说,类型检查器不需要任何类型的特殊知识来知道一个值是否是那个类型。如果它看到您将此函数的结果存储在类型为 Bob 的变量中, 或 Bob 的父类(super class)型(其中包括 objectAny ,还包括未注释的变量),这是合法的;如果它看到您将其存储在类型为 int 的变量中或其他一些不相关的类型,它不是。同样,如果将结果传递给参数为 Bob 的其他函数。或 Any或未注释,或者将其附加到 List[Bob]等。

但是np.array是一个不同的问题。这实际上不是一个类型,它只是一个构造函数,通常返回一个类型为 np.ndarray 的值,这是您通常不会在任何地方想到的类型。因此,如果没有某些特殊信息,类型检查器就无法处理 array应被视为 ndarray 的同义词.

另外,许多 NumPy 函数——以及隐含的你自己编写的函数——实际上采用“类数组”,它可以是 ndarray ,或者通常是 matrix ,但也经常是任何序列。在这种情况下,你可能真的想用更准确的东西来注释,比如 typing.Sequence — 或者可能使用自定义 ArrayLike输入。

当我们这样做的时候,你经常想要指定数据类型——你的函数不需要一个数组,它想要一个 float 数组,或者它想要一个 <something> 的数组并想返回 Bob其值相同<something> .所以,你可能想要一个像 Sequence[float] 这样的泛型类型。或 Sequence[T]某些类型变量 T .

您甚至可能需要一定数量的维度,甚至这些维度的形状,甚至是部分形状,甚至是参数xy必须可以一起广播或可乘。您可以将此信息推送到泛型类型中,但您必须仔细考虑。

无论如何,对于您自己的类型,您很少需要深入思考。 Bob是一个简单的类型,只需要标准的继承规则,所以你不需要做任何事情,或者它是一个泛型集合类型,你只需要继承/注册它为MutableSequenceMapping或其他任何东西,它会自动获取适当的通用规则,或者它是特定的集合类型,您只需继承/注册为 Set[int]它会自动获取相应的规则。

关于Python 3.6 类型检查 : numpy arrays and use defined classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51933936/

相关文章:

python - 求根的闭式解

pandas - 连续检查缺失的日期时间值的问题

python - 字典列表中值子集的平均值

python - 苹果系统; Python3; FileNotFoundError : [Errno 2] No such file or directory: '' . 如何修复?

ruby - 如何检查 Ruby 对象是否为 bool 值

mysql - 是否可以使用正则表达式在 MySQL 中强制执行数据检查

python - 缓存 Julia 模块以在 Python 中更快地启动和使用

python从列表中的字符串中删除空格

python - 无法将组添加到 Django 用户

python-2.7 - 如何在python中检查变量是否为enum类型