1
aijam 2020-11-20 15:26:25 +08:00 1
先回答你的问题:
> 后面这句指的是 3.9 弃用 collections.abc.Iterable,还是弃用 typing.Iterable? 弃用 typing.Iterable > 转到 typing 模块去归一定义 不对,是反过来:3.9 之后 typing 里很多和标准库本来就有的重复的东西被 deprecate 了 ------------------------------------------------------------------------------------ 3.9 之前,你写 list of string 的 type annotation 需要写"var: typing.List[str]"。 3.9 之后,你直接用 builtin 的类型 list,只需要写"var: list[str]",不需要 import typing 。 基本改革方向就是:“如果标准库里有这个类型了,就不用在 typing 里专门为了 type annotation 又重复定义一个了”。所以,标准库里本来就有 collections.abc.Iterable,它是 list, tuple, dict 等共同的抽象父类,所以没必要保留 typing.Iterable 了。 |
2
xiaolinjia 2020-11-20 15:28:16 +08:00 1
我判断类型从来不用 typing 的模块,只用 collections.abc 。
写类型注解的时候才用 typing |
3
xiaolinjia 2020-11-20 15:43:03 +08:00
py36,刚试了下,collections.abc 的 Sequence 等容器不能在类型注解的时候写成 Sequence[str]啊。只有 typing 下的 Sequence 才可以写成 Sequence[str]。
|
4
imn1 OP @aijam
明白了 collections.abc.Iterable now supports [] ➡️ collections.abc.Iterable 开始支持子类型 刚才还没想明白这个方括号指什么…… |
5
imn1 OP @xiaolinjia #3
以粗陋的英语能力理解,是需要带__class_getitem__()魔术方法,而这个是 py3.9 加入的 |
8
xiaolinjia 2020-11-20 16:09:26 +08:00
@imn1 不知道我的理解对不对。我现在的想法是,py36 的时候,还没有抽象出__class_getitem__()魔术方法,这时,如果在类型注解中使用 collections.abc.Sequence[str]时,ide 会提示 type 类没有定义__getitem__魔术方法,所以注解失败。(因为 collections.abc.Sequence 是 type 类的实例)。
然后 py37 的时候,出现了__class_getitem__魔术方法这个接口,但是内置的类型比如 list,还是没有定义了__class_getitem__这个方法。直到 py39 的时候,内置类型 list 才定义了这个方法,使得 list[str]也能用于注解了。 |
9
imn1 OP @xiaolinjia #8
我反正感觉 py39 要改一波代码,现在没写 type hint 还好说…… 另外想写个类型相关的装饰器,用来临时检查也好,实用类型转换也好,如果 typing 相关在 3.9 弃用,就要重新考虑怎么写了,今天主要想搞清这个问题 |
10
xiaolinjia 2020-11-20 17:25:01 +08:00
@imn1 刚咨询了下大佬,从 37 引入__class_getitem__方法开始,就可以通过 from__future__ import annotations 来使用 a: list[str] = ['a']了。
|