是否有用于键入类型的规范“实例”实现?

问题描述 投票:0回答:1

您无法在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 ...

python-3.x mypy python-typing pydantic
1个回答
1
投票

不,没有这种规范的检查。正如评论者所说,键入是为静态类型检查引入的,我认为许多核心开发人员都认为应该保持这种状态。

© www.soinside.com 2019 - 2024. All rights reserved.