Quando si esegue il wrapping di un iteratore (interno), è spesso necessario reindirizzare il metodo __iter__
al sottostante iterabile. Considera il seguente esempio:"yield from iterable" vs "return iter (iterable)"
class FancyNewClass(collections.Iterable):
def __init__(self):
self._internal_iterable = [1,2,3,4,5]
# ...
# variant A
def __iter__(self):
return iter(self._internal_iterable)
# variant B
def __iter__(self):
yield from self._internal_iterable
C'è qualche differenza significativa tra la variante A e B? Variant A restituisce un oggetto iteratore che è stato interrogato tramite iter()
dall'interno iterabile. Variant B restituisce un oggetto generatore che restituisce valori dall'interno iterabile. L'uno o l'altro è preferibile per qualche motivo? In collections.abc
viene utilizzata la versione yield from
. La variante return iter()
è lo schema che ho usato fino ad ora.
Supponendo l'obiettivo è quello di trasferire semplicemente/esporre l'iterabile sottostante, ovvero nessuna modifica/iniezione di altri elementi, penso di restare con 'iter()' perché: 1) se non aggiungere alcun comportamento aggiuntivo, non ne ho bisogno per apparire sul traceback di eccezione (credo?). 2) per evitare di usare il globale 'iter()' potrei chiamare 'return internal_iterable .__ iter __()'. Riguardo al terzo punto che hai sollevato, dovrò pensare a cosa significhi. – PeterE