TypeError: objet de type de l'argument après * doit être un ordre, pas de générateur
Pourquoi le code Python suivant génère une erreur
TypeError: type object argument after * must be a sequence, not generator
alors que si j'commentaire de la première (inutile) dans le générateur de f, tout fonctionne bien?
from itertools import izip
def z():
for _ in range(10):
yield _
def f(z):
for _ in z: pass # if I comment this line it works! (??)
for x in range(10):
yield (x,10*x,100*x,1000*x)
iterators = izip(*f(z))
for it in iterators:
print list(it)
N. B. Ce que je suis en train d'essayer de faire, avec un seul générateur, de retour de plusieurs itérateurs (autant que je vais passer à la génératrice arguments). Le seul moyen que j'ai trouvé à faire, c'est-à rendement tuples et l'utilisation izip () - magie noire pour moi.
Vous pourriez trouver
tee
de itertools intéressant ...tee
a pour courir à travers et stocker tous les éléments une fois avant de pouvoir dupliquer l'itérateur, cf. la documentation: docs.python.org/3.1/library/itertools.html#itertools.tee. Malheureusement, il n'y a pas de magie, et mon but ici était naïf.OriginalL'auteur JulienD | 2013-03-21
Vous devez vous connecter pour publier un commentaire.
C'est amusant: j'ai oublié de vous appeler
z
lorsque vous avez réussi àf
:Donc
f
essayé de faire une itération sur un objet de fonction:Cela a soulevé une exception TypeError:
Python les entrailles de l'attrapa et le surrelance avec une source de confusion message d'erreur.
Quatre ans, wow.
Oh merci beaucoup!
On dirait que c'est seulement récemment. J'ai été mordu par le présent code qui souhaitait utiliser
zip(*...)
sur un générateur qui pourraitraise TypeError
s en interne - j'avais prévu pour de telles erreurs et destinées à propager. On dirait que j'ai de construire le "zippé" listes manuellement pour l'instant, puisque je suis toujours sur la version 3.4 🙁OriginalL'auteur Pavel Anossov