Comment puis-je sous-classe collections.Iterator?
-
02-10-2019 - |
Question
Selon la documentation sur ABCs, Je devrais avoir à ajouter une méthode next
pour être en mesure de sous-classe collections.Iterator
. Donc, j'utilise la classe suivante:
class DummyClass(collections.Iterator):
def next(self):
return 1
Cependant, je reçois une erreur lorsque je tente de instancier:
>>> x = DummyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class DummyClass with abstract methods __next__
Je devine que je fais quelque chose de stupide, mais je ne peux pas comprendre ce qu'elle est. Quelqu'un peut-il faire la lumière à ce sujet? Je pourrais ajouter une méthode __next__
, mais j'avais l'impression qui était que pour les classes C.
La solution
On dirait que vous utilisez Python 3.x. Votre code fonctionne très bien sur Python 2.x.
>>> import collections
>>> class DummyClass(collections.Iterator):
... def next(self):
... return 1
...
>>> x = DummyClass()
>>> zip(x, [1,2,3,4])
[(1, 1), (1, 2), (1, 3), (1, 4)]
Mais 3.x Python, vous devez mettre en œuvre __next__
au lieu de next
, comme indiqué dans le tableau de le Py3K doc . (Rappelez-vous de lire la version correcte!)
>>> import collections
>>> class DummyClass(collections.Iterator):
... def next(self):
... return 1
...
>>> x = DummyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can’t instantiate abstract class DummyClass with abstract methods __next__
>>> class DummyClass3k(collections.Iterator):
... def __next__(self):
... return 2
...
>>> y = DummyClass3k()
>>> list(zip(y, [1,2,3,4]))
[(2, 1), (2, 2), (2, 3), (2, 4)]
Ce changement est introduit par PEP-3114 - Changement de nom iterator.next()
à iterator.__next__()
.