タイピングドキュメント で説明されているように、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
で実行してみました。
ライブラリtyping
は3.5では公式ではありませんでしたが、3.6で公式になりました。したがって、3.6より古い場合は、特定のライブラリをインストールする必要があります: 入力モジュール
3.6の場合、公式になったので何も必要ありません
Awaitable
(Coroutine
と同じ問題が発生します)でこの問題が発生しました。 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
を除いて、同じ回避策です。