python – 如何在使用输入模块时检查类型兼容性?

我正在使用
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这样的更复杂的检查时,这种检查是否可以保证能够解决问题

最佳答案 如果issubclass的参数都不包含来自输​​入模块的构造,例如Union,Callable,Any,泛型等,则issubclass检查就足够了.

在python运行时中输入构造作为其真实形式的阴影,即它们不支持许多在概念上有意义的操作:

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

有时,issubclass会使用输入结构,但一般情况下,它可能会引发异常或给出错误的答案;你需要根据具体情况弄清楚要做什么.

mypy有一个更复杂的is_subtype,因为它确实需要处理所有的输入结构,即便如此,仍然有一些工作要做.

点赞