opu*_*111 5 python typechecking python-3.6
我认为这个问题已经被问过,但我找不到它
如何检查 Python 3.6 中的非内置类型?
例如,假设我想要一个函数 foo() ,它将 numpy 数组作为参数,并返回我的类 Bah 的实例
def foo(a: np.array) -> Bah
Run Code Online (Sandbox Code Playgroud)
我可以做这样的事情吗?如何将这些类型添加到检查中?
aba*_*ert 10
如果 type\xe2\x80\x99s 名称在范围内,您可以指定任何您想要的内容作为类型注释(例如,您\xe2\x80\x99veBob在当前文件中定义,或完成了from stuff importBob`)。
一般来说,类型检查器不需要任何类型的特殊知识来知道值是否是该类型。如果它发现您将此函数的结果存储在类型为Bob或 的超类型Bob(包括object和Any,还包括未注释的变量)的变量中,则 \xe2\x80\x99 是合法的;int如果它看到您将其存储在类型为或其他不相关类型的变量中,则它\xe2\x80\x99 不会。类似地,如果您将结果传递给参数为Bob或Any或未注释的其他函数,或者将其附加到List[Bob]等。
但这np.array是一个不同的问题。这实际上不是一个类型,它只是一个构造函数,通常返回 type 的值np.ndarray,这是您通常不会在任何地方考虑的类型。因此,类型检查器可以\xe2\x80\x99t 处理这种情况,而无需某种array应被视为 的同义词的特殊信息ndarray。
另外,许多 NumPy 函数\xe2\x80\x94 以及您自己编写的隐式函数\xe2\x80\x94 实际上采用 \xe2\x80\x9carray-like\xe2\x80\x9d,它可以是 , 或者通常ndarray是matrix,但也常常是任意序列。在这种情况下,您可能确实想要使用更接近准确的内容进行注释,例如typing.Sequence\xe2\x80\x94 或使用自定义ArrayLike类型。
当我们\xe2\x80\x99 这样做时,您经常想要指定 dtype\xe2\x80\x94您的函数不需要\xe2\x80\x99 一个数组,它需要一个浮点数组,或者它想要一个 和 的<something>数组想要返回一个Bob值相同的a <something>。因此,您可能想要一个像Sequence[float]或Sequence[T]那样的泛型类型 typevar T。
您甚至可能需要一定数量的维度,甚至这些维度的形状,甚至部分形状,甚至该参数x必须y可以一起广播或可相乘。您可以将此信息推入通用类型,但您\xe2\x80\x99 必须非常仔细地考虑它。
无论如何,对于你自己的类型,你很少需要思考得那么深。要么Bob是只需要标准继承规则的简单类型,因此您不需要执行任何操作,要么是通用集合类型,您只需将其继承/注册为aMutableSequence或 aMapping或其他什么,它会自动获取适当的通用规则,或者它\xe2\x80\x99s 是特定的集合类型,您只需继承/注册为 a Set[int],它就会自动获取适当的规则。
| 归档时间: |
|
| 查看次数: |
11625 次 |
| 最近记录: |