El operator.itemgetter() función funciona así:Python: funciones devueltos por itemgetter() no funciona como se espera en las clases
>>> import operator
>>> getseconditem = operator.itemgetter(1)
>>> ls = ['a', 'b', 'c', 'd']
>>> getseconditem(ls)
'b'
Editar He añadido esta parte para resaltar la inconsitency
>>> def myitemgetter(item):
... def g(obj):
... return obj[item]
... return g
>>> mygetseconditem = myitemgetter(1)
Ahora, tengo esta clase
>>> class Items(object):
... second = getseconditem
... mysecond = mygetseconditem
...
... def __init__(self, *items):
... self.items = items
...
... def __getitem__(self, i):
... return self.items[i]
Acceso al segundo elemento con su índice funciona
>>> obj = Items('a', 'b', 'c', 'd')
>>> obj[1]
>>> 'b'
y lo mismo ocurre para acceder a él a través de la mysecond
método
>>> obj.mysecond()
'b'
Pero por alguna razón, utilizando el método second()
genera una excepción
>>> obj.second()
TypeError: itemgetter expected 1 arguments, got 0
¿Qué ofrece?
Técnicamente, dado que se llama como método, generalmente se obtiene a sí mismo como una opción automática. Mi suposición es que asociar la función al objeto de esa manera hace que el tiempo de ejecución lo trate como un método "estático". Puede haber un decorador que pueda usar para forzarlo a tratarlo como un método. – Cyclone
@Rob Wouters: Creo que mi pregunta es qué hace que mi tarea 'mysecond = mygetseconditem' sea especial. ¿Por qué funciona uno y el otro no? –
@mike, he editado mi respuesta para agregar lo que creo que está causando la discrepancia. –