依赖于Python版本的类型注释



问题:

我想对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]

相关内容

  • 没有找到相关文章

最新更新