Fel*_*ipe 5 python type-hinting mypy
我正在使用 Python PEP484 类型提示为我用 Python 编写的 DSL 编写类型检查器。如果我有一个函数需要T其参数之一的类型,并且使用 type 的表达式调用它S,那么如何检查该调用是否有效?使用issubclass(S, T)够了吗?如果是这样,为什么要mypy进行如此复杂的is_subtype检查?或者我应该只使用该mypy版本?
编辑:这是一个例子来澄清我的意思。DSL 的功能定义为:
T = TypeVar('T', float, str)
def op_add(operand1: T, operand2: T) -> T:
"Number addition or string concatenation."
# In this DSL, `+` cannot be used with lists
return operand1 + operand2 # Rely on Python overloading of `+`
Run Code Online (Sandbox Code Playgroud)
然后,用户输入一个表达式,该表达式被解析为语法树,其分支可以是:node = OperatorNode('+', Literal([5.0]), Variable("abc"))。我们还不知道变量的值abc,但列表永远不能与 一起使用+,所以我想引发 aTypeError来提醒用户。
如果我这样做issubclass(typing.List[float], var),就会给我 False,所以我可以立即提出错误。我的问题是,当我构建 DSL 时,此检查是否能保证跨情况工作,或者我是否需要使用更复杂的检查,例如mypy
issubclassissubclass如果两个参数都不包含来自模块的构造,typing例如Union、Callable、Any、 泛型等,则检查就足够了。
typingPython 运行时中的构造作为其真实形式的影子存在,也就是说,它们不支持许多概念上有意义的操作:
issubclass(List[int], List[int]) # runtimem error
issubclass(List[int], List) # True (as expected)
issubclass(str, Union[str]) # runtime error
issubclass(Union[str], str) # True (as expected)
issubclass(Union[int, str], str) # runtime error
Run Code Online (Sandbox Code Playgroud)
有时issubclass会与typing构造一起使用,但一般来说,它可能会引发异常或给出错误的答案;您需要根据具体情况弄清楚该怎么做。
mypy有一个更复杂的is_subtype,因为它确实需要处理所有的typing构造,即使这样,仍然有一些工作要做。
| 归档时间: |
|
| 查看次数: |
1249 次 |
| 最近记录: |