我想这已经被问过了,但我找不到它
如何在 Python 3.6 中检查非内置类型?
例如,假设我想要一个函数 foo(),它将一个 numpy 数组作为 arg,并返回我的类 Bah 的一个实例
def foo(a: np.array) -> Bah
我可以这样做吗?如何将这些类型添加到检查中?
最佳答案
如果类型的名称在范围内(例如,您在当前文件中定义了 Bob
,或者完成了 from stuff import
Bob`),您可以指定任何您想要的作为类型注释。
一般来说,类型检查器不需要任何类型的特殊知识来知道一个值是否是那个类型。如果它看到您将此函数的结果存储在类型为 Bob
的变量中, 或 Bob
的父类(super class)型(其中包括 object
和 Any
,还包括未注释的变量),这是合法的;如果它看到您将其存储在类型为 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
.
您甚至可能需要一定数量的维度,甚至这些维度的形状,甚至是部分形状,甚至是参数x
和 y
必须可以一起广播或可乘。您可以将此信息推送到泛型类型中,但您必须仔细考虑。
无论如何,对于您自己的类型,您很少需要深入思考。 Bob
是一个简单的类型,只需要标准的继承规则,所以你不需要做任何事情,或者它是一个泛型集合类型,你只需要继承/注册它为MutableSequence
或 Mapping
或其他任何东西,它会自动获取适当的通用规则,或者它是特定的集合类型,您只需继承/注册为 Set[int]
它会自动获取相应的规则。
关于Python 3.6 类型检查 : numpy arrays and use defined classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51933936/