La ejecución de este:¿Cómo sobrescribir el comportamiento de la lista de Python (iterador)?
class DontList(object):
def __getitem__(self, key):
print 'Getting item %s' % key
if key == 10: raise KeyError("You get the idea.")
return None
def __getattr__(self, name):
print 'Getting attr %s' % name
return None
list(DontList())
Produce esto:
Getting attr __length_hint__
Getting item 0
Getting item 1
Getting item 2
Getting item 3
Getting item 4
Getting item 5
Getting item 6
Getting item 7
Getting item 8
Getting item 9
Getting item 10
Traceback (most recent call last):
File "list.py", line 11, in <module>
list(DontList())
File "list.py", line 4, in __getitem__
if key == 10: raise KeyError("You get the idea.")
KeyError: 'You get the idea.'
cómo puedo cambiar eso para que voy a conseguir []
, al tiempo que permite el acceso a dichas claves [1]
etc.?
(He intentado poner en def __length_hint__(self): return 0
, pero no ayuda.)
Mi caso de uso real: (para la lectura si va a ser útil, no dude en ignorar allá de este punto)
Después de aplicar a certain patch a iniparse, he encontrado un desagradable efecto secundario en mi parche. Tener __getattr__
establecido en mi clase Undefined
, que devuelve un nuevo objeto Undefined
. Desafortunadamente, esto significa que list(iniconfig.invalid_section)
(donde isinstance(iniconfig, iniparse.INIConfig)
) está haciendo esto (poner en simples print
s en el __getattr__
y __getitem__
):
Getting attr __length_hint__
Getting item 0
Getting item 1
Getting item 2
Getting item 3
Getting item 4
Etcétera hasta el infinito.
Tenga en cuenta que algunas de estas respuestas ignorar ciertos aspectos de la lista (x) - será __iter__ primera llamada y luego __len__ en que si lo que existe y luego se extenderá hasta el iterador. Asegúrate de que si __len__ tiene algún efecto secundario (en uno de mis objetos debe correr por el propio iterador para saber cuántos elementos tiene) que se restablece cuando termina. –