【问题标题】:python typing module missing the Coroutine class in python 3.5python类型模块缺少python 3.5中的Coroutine类
【发布时间】:2017-11-22 21:11:34
【问题描述】:

我正在尝试编写使用Coroutine 类的代码,如typing documentation 中所述。

看起来它在python 3.5 中可用,但是当我输入要导入时,它会抛出一个ImportError

In [1]: from typing import Coroutine

ImportError: 无法导入名称“协程”

然后,我尝试在 Python 3.6 中运行代码,它运行良好。 python 3.5没有这个课程吗?如果不是,为什么它出现在文档中(特别是 python 3.5)?我尝试使用python 3.5.2 运行它。

【问题讨论】:

  • 我尝试在 python 3.5 中导入并且它工作正常。再次尝试检查您的 python 版本
  • @RajSubit 你用的是什么版本的python?
  • 刚刚在 python 3.5.3 中尝试过
  • @YuvalPruss 您所指的文档适用于 3.5.3 版。 RajSubit 似乎已经验证了 3.5.3 的一切正常。如果您检查documentation for 3.5.2,您会发现Coroutine 没有在此处提及。因此,您的 Python 发行版版本与您引用的文档不匹配。
  • 这是一个已知问题——因为 typing 模块是自 3.5.0 以来标准库的一部分,您无法访问对 typing 的任何更改从那时起。有计划向 pypi 添加一个 typing_extensions 模块,该模块将包含这些缺失的定义(包括协程),这些定义将由类型检查器进行特殊处理,但 discussion seems to have fizzled out.也许你可以在那里发布一些东西来尝试恢复讨论?

标签: python python-3.x python-3.5 type-hinting typing


【解决方案1】:

typing 在 3.5 上不是官方的,但在 3.6 上成为官方的。因此,对于 3.6 之前的版本,您需要安装特定的库:Typing module
对于 3.6,您什么都不需要,因为它已成为官方版本

【讨论】:

  • 但是整个模块在python 3.5中都有,只是这个特定的类不可用,虽然文档里有写。
  • 您是否至少尝试过安装此模块?也许在 3.5.2 上,除了协程之外,每个都是端口。这也许是他只在 3.6 上正式成为官方的原因。如果在对这个模块做了一个点之后它仍然不起作用,那么我错了。
  • @LudovicGuerra 我用 Python 3.5.2 检查过:pip install typing=>Successfully installed typing-3.6.1。但是,typing 模块中仍然缺少 Coroutine。诚然,这些文档适用于 3.5.3。
  • 在 3.5 中,运行 pip install typing 将无济于事,因为 stdlib typing 模块仍会影响站点包 typing 模块
  • @AnthonySottile 你说得对,pip 的typing 模块实际上包含Coroutine 类。
【解决方案2】:

刚刚遇到Awaitable 的这个问题(与Coroutine 存在相同的问题)。 stdlib 中缺少它,似乎没有简单的方法可以从 pypi 中提取它。如果您使用 Python 3.5,那么此解决方法可能对您有用:

我们依赖的事实是,尽管 Python 3.5 标准库 typing 不包含 Coroutine(或 Awaitable),mypy 实际上似乎并未使用标准库 typing。相反,当调用它时,它使用自己的typing 模块版本。因此,只要您的mypy 是最新的,它就会知道typing.Coroutine(和typing.Awaitable)。因此,您唯一需要做的就是在运行时伪造这些类型的存在(您无法导入它们)。可以这样实现:

from typing import Any, TYPE_CHECKING
try:
    from typing import Coroutine
except ImportError:
    class _Coroutine:
        # Fake, so you can do Coroutine[foo, bar, baz]
        # You could assert the proper number of items are in the slice,
        # but that seems like overkill, given that mypy will check this
        # and at runtime you probably no longer care
        def __getitem__(self, index: Any) -> None:
            pass

    if not TYPE_CHECKING:
        Coroutine = _Coroutine()

之后,照常使用Coroutine[A, B, C]。您的代码将正确地进行类型检查,并且在运行时您不会因为 3.5 标准库中缺少它而遇到任何问题。

这确实会阻止您执行任何 RTTI,但 AFAIK 是 PEP 的一部分,无论如何都在 3.6(或者可能是 3.7)中进行了实验。

对于Awaitable,除了s/Coroutine/Awaitable之外,它是相同的解决方法。

【讨论】:

    【解决方案3】:

    我一直面临同样的问题,在浪费了一个小时后,找到了这个解决方案here

    import typing
    try:
        from pyppeteer import launch
    except ImportError:
        from typing_extensions import Coroutine
        typing.Coroutine = Coroutine
        from pyppeteer  import launch
        from typing import Any, Callable, Coroutine, Dict, List, Optional
    

    我希望它也对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 2018-07-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多