web-dev-qa-db-fra.com

Tapez le générateur d'indices dans python 3.6

Selon PEP-484 , nous devrions pouvoir taper en faisant allusion à une fonction de générateur comme suit:

from typing import Generator

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

for i in generate():
    print(i)

Cependant, la compréhension de la liste donne l'erreur suivante dans PyCharm.

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

Une idée pourquoi PyCharm considère cela comme une erreur? Je vous remercie.


Quelques précisions après avoir lu quelques réponses. J'utilise PyCharm Community Edition 2016.3.2 (la dernière version) et j'ai importé le typing.Generator (mis à jour dans le code). Le code ci-dessus fonctionne très bien, mais PyCharm considère qu'il s'agit d'une erreur:

enter image description here

Je me demande donc s'il s'agit en fait d'une erreur ou d'une fonctionnalité non prise en charge dans PyCharm.

21
Jinho Choi

Comme commenté par Oleksandr Dashkov , j'ai essayé le même code avec Pycharm 2017.1 EAP, qui gère correctement cette annotation. Je suppose que cette fonctionnalité sera intégrée dans la prochaine version officielle de PyCharm. Merci à tout le monde.

3
Jinho Choi

Vous devez importer le module typing. Selon les documents:

Le type de retour des fonctions du générateur peut être annoté par le type générique Generator[yield_type, send_type, return_type] fourni par typing.py module

Essayez plutôt de cette façon:

from typing import Generator


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

Ce qui précède aura le résultat souhaité:

l = [i for i in generate()]

Production:

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


Comme indiqué dans les commentaires, vous pourriez ne pas utiliser la dernière version de PyCharm. Essayez de passer à la version 2016.3.2 et vous pourriez être bien. Malheureusement, c'est un bug bien connu, selon le commentaire @AshwiniChaudhary.

De plus, le problème signalé (pour la dernière version de PyCharm) a été soumis en décembre de l'année dernière. Ils l'ont probablement corrigé et ont poussé les modifications dans la même version.

17
user6165050