Python 3.6类型检查:numpy数组并使用已定义的类

时间:2018-08-20 15:22:51

标签: python python-3.6 typechecking

我想这个问题已经被问到了,但是我找不到它

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

通常,类型检查器不需要任何类型的特殊知识即可知道某个值是否为该类型。如果看到此函数的结果,则将其结果存储在类型为BobBob的超类型(包括objectAny且还包含未注释的变量)中变量),这是合法的;如果看到您将其存储在类型为int或其他不相关类型的变量中,则不是。同样,如果将结果传递给参数为BobAny或未注释的其他函数,或者将其附加到List[Bob]等上,则为

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

此外,许多NumPy函数(以及您自己编写的函数)实际上都采用“类似数组的形式”,可以是ndarray,通常是matrix,但通常任何顺序。在这种情况下,您可能真的想用更精确的注释(例如typing.Sequence)或使用自定义的ArrayLike类型进行注释。

在使用此代码时,您通常需要指定dtype-您的函数不需要数组,需要浮点数组,或者需要<something>数组并想要返回a其值与Bob相同的<something>。因此,您可能希望将Sequence[float]Sequence[T]之类的通用类型应用于某种类型变量T

您甚至可能需要特定数量的尺寸,甚至需要这些尺寸的形状,甚至 partial 形状,甚至是参数x和{{1 }}必须可以一起广播或可以广播。您可以将这些信息推送为通用类型,但必须仔细考虑。

无论如何,对于您自己的类型,您几乎不必深思。 y是仅需要标准继承规则的简单类型,因此您无需执行任何操作,或者它是通用集合类型,您只需要将其继承/注册为{{1} }或Bob之类的东西,它会自动获取适当的通用规则,或者它是特定的集合类型,您只需继承/注册为MutableSequence,它就会自动获取适当的规则。

答案 1 :(得分:1)

您可以使用键入。这是一个Python库https://docs.python.org/3/library/typing.html

import numpy as np
from bar import Bah
from typing import Type

def foo(a: np.ndarray): -> Type[Bah]
    return a.T  #example

答案 2 :(得分:0)

基本上,如果您知道a是一个numpy数组,则只需查看type(a)的输出即可。这将告诉您该类称为“ numpy.ndarray”。然后通过使用isinstance()进行检查。像这样:

import numpy #if you import numpy as np, you need to check for np.ndarray instead

def foo(a):
    if isinstance(a,numpy.ndarray):
        return Blah()
    else:
        print('a needs to be of type numpy.ndarray')
        return