您无法在typing检查中使用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 stdlib的激励性示例:
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
并不真正支持它声称的类型注释调度。
[您不能在等例检查中使用像Dict [str,int]这样的类型:Python 3.7.6(默认值,2019年12月30日,19:38:28)键入'copyright','credits'或'license'有关更多信息,请参见IPython 7.12.0-An ...
不,没有这种规范的检查。正如评论者所说,键入是为静态类型检查引入的,我认为许多核心开发人员都认为应该保持这种状态。