问题:
我想对collections.deque
使用类型注释,但由于我们必须支持较旧的python版本(确切地说是3.4和3.5,它们不受官方的支持并不重要),我希望我的代码在我们必须支持的所有python版本中都是有效的。
我的原始代码:
from collections import deque
from typing import Deque
a = deque() # type: Deque[int]
它在3.7中运行得很好,但在3.5中,我得到了ImportError: cannot import name 'Deque'
。
我尝试过的:
所以我想这样修改:
from typing import Sequence
try:
from typing import Deque
except ImportError:
Deque = Sequence
from collections import deque
a = deque() # type: Deque[int]
但后来我出现了错误:
$ mypy . --pretty
a.py:5: error: Cannot assign multiple types to name "Deque" without an explicit "Type[...]" annotation
Deque = Sequence
^
a.py:5: error: Incompatible types in assignment (expression has type "Type[Sequence[Any]]", variable has
type "Type[deque[Any]]")
Deque = Sequence
^
Found 2 errors in 1 file (checked 1 source file)
问题:
有没有一种方法可以让相同的代码即使在python3.4和python3.5中也有效,同时为deque进行类型注释?
注:
是的,我知道3.4和3.5不是官方支持的。但这个事实对我一点帮助都没有。请不要告诉我升级。
无论运行时typing
库是否支持,类型检查器都使用自己版本的typing
功能。Deque[int]
之类的类型可以自由用于签入任何版本,只要它在运行时不使用即可。
-
如果
typing
模块在所有需要的版本上都可用,则保护导入:from collections import deque from typing import TYPE_CHECKING if TYPE_CHECKING: # not entered at runtime from typing import Deque # only happens during static type checking a = deque() # type: Deque[int]
typing
模块可以作为后端口添加到3.5之前的版本中。 -
不支持所有必需类型功能的版本的通用解决方案是
pyi
存根文件。# a.py from collections import deque a = deque()
# a.pyi from typing import Deque a: Deque[int] = ...
也许这(或其变体)可以在中工作
import sys
if sys.version_info[:2] >= (3,7):
from typing import Deque
else:
from typing import Sequence as Deque
from collections import deque
a = deque() # type: Deque[int]