web-dev-qa-db-ja.com

python 3.6のタイプヒンティングジェネレータ

PEP-484 によると、次のようにジェネレーター関数のヒントを入力できます。

from typing import Generator

def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

for i in generate():
    print(i)

ただし、リストの内包表記では、PyCharmで次のエラーが発生します。

Expected 'collections.Iterable', got 'Generator[int, None, None]' instead less... (⌘F1)

PyCharmがこれをエラーとみなしている理由は何ですか?ありがとうございました。


いくつかの答えを読んだ後のいくつかの説明。 PyCharm Community Edition 2016.3.2(最新バージョン)を使用しており、typing.Generator(コードで更新)。上記のコードは正常に実行されますが、PyCharmはこれをエラーとみなします:

enter image description here

だから、これが実際にエラーなのか、PyCharmのサポートされていない機能なのか疑問に思っています。

21
Jinho Choi

Oleksandr Dashkov がコメントしたように、Pycharm 2017.1 EAPで同じコードを試しました。これはこのアノテーションを正しく処理します。この機能はPyCharmの次の公式バージョンに統合されると思います。皆に感謝します。

3
Jinho Choi

typingモジュールをインポートする必要があります。ドキュメントごと:

ジェネレーター関数の戻り値の型には、ジェネリック型Generator[yield_type, send_type, return_type] によって提供された - typing.pyモジュール

代わりにこの方法を試してください:

from typing import Generator


def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

上記は望ましい結果になります:

l = [i for i in generate()]

出力:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


コメントで指摘されているように、PyCharmの最新バージョンを使用しない場合があります。バージョン2016.3.2に切り替えてみて、あなたmightで問題ありません。残念ながら、これは@AshwiniChaudharyのコメントによると、よく知られたバグです。

さらに、報告された問題(最後のバージョンのPyCharm)は、昨年12月に提出されました。彼らはおそらくそれを修正し、修正を同じバージョンにプッシュしました。

17
user6165050