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:
Je me demande donc s'il s'agit en fait d'une erreur ou d'une fonctionnalité non prise en charge dans PyCharm.
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.
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 partyping.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.