web-dev-qa-db-ja.com

pythonタイピングモジュールにコルーチンクラスがありませんpython 3.5

タイピングドキュメント で説明されているように、Coroutineクラスを使用するコードを記述しようとしています。

python 3.5で利用できるように見えますが、インポートするために入力すると、ImportErrorがスローされます。

In [1]: from typing import Coroutine

ImportError:名前「コルーチン」をインポートできません

次に、Python 3.6でコードを実行しようとしましたが、正常に機能しました。このクラスはpython 3.5では利用できませんか?そうでない場合、なぜそれが(特にpython 3.5の)ドキュメントに表示されるのですか? python 3.5.2で実行してみました。

9
Yuval Pruss

ライブラリtypingは3.5では公式ではありませんでしたが、3.6で公式になりました。したがって、3.6より古い場合は、特定のライブラリをインストールする必要があります: 入力モジュール
3.6の場合、公式になったので何も必要ありません

8
Ludovic Guerra

AwaitableCoroutineと同じ問題が発生します)でこの問題が発生しました。 stdlibにはないので、pypiからプルする簡単な方法はないようです。 Python 3.5に縛られている場合は、この回避策が役立つ可能性があります。

Python 3.5 stdlib typingにはCoroutine(またはAwaitable)が含まれていないにもかかわらず、mypyは実際にはstdlibtypingを使用しているようには見えません。代わりに、呼び出されると、独自のバージョンの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.5stdlibから欠落しているため問題は発生しません。

これにより、RTTIを実行できなくなりますが、とにかく3.6(または3.7)で実験的に着陸したPEPの一部であるAFAIKです。

Awaitableの場合、s/Coroutine/Awaitableを除いて、同じ回避策です。

2
Bailey Parker