La meilleure approche, à mon avis, serait d'éviter un test spécial. La plupart du temps, l'utilisation d'un générateur est le test :
thing_generated = False
# Nothing is lost here. if nothing is generated,
# the for block is not executed. Often, that's the only check
# you need to do. This can be done in the course of doing
# the work you wanted to do anyway on the generated output.
for thing in my_generator():
thing_generated = True
do_work(thing)
Si cela ne suffit pas, vous pouvez toujours effectuer un test explicite. A ce stade, thing
contiendra la dernière valeur générée. Si rien n'a été généré, elle sera indéfinie - à moins que vous n'ayez déjà défini la variable. Vous pouvez vérifier la valeur de thing
mais ce n'est pas très fiable. Au lieu de cela, il suffit de définir un drapeau dans le bloc et de le vérifier par la suite :
if not thing_generated:
print "Avast, ye scurvy dog!"
0 votes
Corrigez-moi si je me trompe, mais si vous pouviez faire une solution vraiment générique pour tout Dans le cas d'un générateur, cela équivaudrait à placer des points d'arrêt sur les déclarations de rendement et à avoir la possibilité de "revenir en arrière". Cela signifierait-il qu'il faut cloner le cadre de la pile sur les déclarations de rendement et le restaurer sur StopIteration ?
0 votes
Eh bien, je suppose que les restaurer StopIteration ou non, mais au moins StopIteration vous dirait qu'il est vide. Ouais, j'ai besoin de dormir...
4 votes
Je pense que je sais pourquoi il veut ça. Si vous faites du développement web avec des modèles, et que vous passez la valeur de retour dans un modèle comme Cheetah ou autre, une liste vide
[]
est commodément Falsey de sorte que vous pouvez faire une vérification if sur elle et faire un comportement spécial pour quelque chose ou rien. Les générateurs sont vrais même s'ils ne produisent aucun élément.1 votes
Voici mon cas d'utilisation... J'utilise
glob.iglob("filepattern")
sur un motif joker fourni par l'utilisateur, et je veux avertir l'utilisateur si le motif ne correspond à aucun fichier. Je peux certainement contourner ce problème de différentes manières, mais il est utile de pouvoir tester proprement si l'itérateur est vide ou non.0 votes
Vous pouvez utiliser cette solution : stackoverflow.com/a/11467686/463758
0 votes
Pour mentionner quelques cas d'utilisation : extraire des éléments de plusieurs itérateurs, comme par exemple
zip
mais en même temps -- soit tout ou rien (soit un élément est extrait de chaque itérateur, soit aucun des itérateurs n'est avancé).