Python 使用打字模块时如何检查类型兼容性?

Python 使用打字模块时如何检查类型兼容性?,python,typing,mypy,Python,Typing,Mypy,我正在使用Python PEP484类型提示为我用Python编写的DSL编写一个类型检查器。如果有一个函数的一个参数需要类型为T,并且正在使用类型为s的表达式调用它,我如何检查调用是否有效?使用issubclass(S,T)是否足够?如果是这样,为什么mypy有如此复杂的is\u子类型检查?或者我应该只使用mypy版本吗 编辑:这里有一个例子来阐明我的意思。DSL的功能定义如下: T = TypeVar('T', float, str) def op_add(operand1: T, oper

我正在使用Python PEP484类型提示为我用Python编写的DSL编写一个类型检查器。如果有一个函数的一个参数需要类型为
T
,并且正在使用类型为
s
的表达式调用它,我如何检查调用是否有效?使用
issubclass(S,T)
是否足够?如果是这样,为什么
mypy
有如此复杂的
is\u子类型检查?或者我应该只使用
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
变量的值,但是列表永远不能与
+
一起使用,所以我想提出一个
类型错误来提醒用户


如果我执行issubclass(键入.List[float],var)
,则会得到False,因此我可以立即引发错误。我的问题是,当我构建DSL时,这个检查是否保证能够跨案例工作,或者如果我需要使用更复杂的检查,如
mypy
issubclass
检查是否足够,如果
issubclass
的两个参数都不包括来自
键入
模块(如
Union
)的结构,
可调用
任何
,泛型等

键入
构造在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_子类型
,因为它确实需要处理所有的
类型
构造,甚至还有一些工作要做。

我使用了一个ABC,然后定义了期望ABC而不是子类的函数,mypy从来没有抱怨过。它到底对您说了什么?在Python 3.7中
issubclass(List[int],List)
引发了类型错误:下标泛型不能用于类和实例检查