【发布时间】:2016-06-20 00:05:44
【问题描述】:
我正在使用 Python PEP484 类型提示为我用 Python 编写的 DSL 编写类型检查器。如果我有一个函数期望其参数之一为 T 类型,并且使用 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 `+`
然后用户键入一个表达式,该表达式被解析为语法树,其分支可能是:node = OperatorNode('+', Literal([5.0]), Variable("abc"))。我们还不知道abc 变量的值,但是列表永远不能与+ 一起使用,所以我想提出一个TypeError 来提醒用户。
如果我做issubclass(typing.List[float], var),那会给我 False,所以我可以立即提出错误。我的问题是,当我构建 DSL 时,是否可以保证此检查适用于各种情况,或者我是否需要使用更复杂的检查,例如 mypy
【问题讨论】:
-
我使用了 ABC,然后定义了期望 ABC 而不是子类的函数,mypy 从未抱怨过。它到底对你说了什么?
标签: python type-hinting mypy