您不能在支票中使用键入类型:Dict[str, int]
isinstance
Python 3.7.6 (default, Dec 30 2019, 19:38:28)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from typing import Dict
In [2]: myvar = {"a": 1}
In [3]: isinstance(myvar, Dict[str, int])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-a8fee57141ae> in <module>
----> 1 isinstance(myvar, Dict[str, int])
然而,任何进行类型检查的库都需要能够做类似的事情isinstance(myvar, Dict[str, int])
(......我意识到它应该被称为不同于 的东西isinstance
,这不是完全相同的东西)
我觉得适用于打字的等效功能必须存在于某处,也许在mypy项目中?(但那里有很多复杂的代码,我至今找不到)
除了 mypy 之外,还有很多项目需要这个,例如pydantic和 AFAICT,它们都有复杂的手动实现,而且似乎有很多边缘案例(或者只是……“案例”)需要列举并覆盖。这会导致错误/有限的类型识别,例如https://github.com/bloomberg/attrs-strict/issues/27
似乎需要此功能的规范实现。是否已经存在一个我没有找到的地方?
我给你一个来自 Python 标准库的激励例子:
https://docs.python.org/3/library/functools.html#functools.singledispatch
对于带有类型注释的函数,装饰器将自动推断第一个参数的类型:
>>> @fun.register
... def _(arg: int, verbose=False):
... if verbose:
... print("Strength in numbers, eh?", end=" ")
... print(arg)
...
>>> @fun.register
... def _(arg: list, verbose=False):
... if verbose:
... print("Enumerate this:")
... for i, elem in enumerate(arg):
... print(i, elem)
嗯,这很酷。但这是作弊,因为这些天我们通常不会使用list
内置函数来注释第二个函数,而是使用类似的东西List[str]
......这不起作用,因为singledispatch
只是做一个幼稚的isinstance
检查,并且不能处理键入泛型。所以singledispatch
并不像它声称的那样真正支持通过类型注释进行调度。