我正在使用 Python PEP484 类型提示为我用 Python 编写的 DSL 编写类型检查器。如果我有一个函数期望T
其参数之一为 type ,并且使用 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 `+`
然后用户键入一个表达式,该表达式被解析为语法树,其分支可能是:node = OperatorNode('+', Literal([5.0]), Variable("abc"))
。我们还不知道abc
变量的值,但是列表永远不能与 一起使用+
,所以我想提出 aTypeError
来提醒用户。
如果我这样做issubclass(typing.List[float], var)
,那会给我 False,所以我可以立即提出错误。我的问题是,当我构建 DSL 时,是否可以保证此检查适用于各种情况,或者我是否需要使用更复杂的检查,例如mypy