This answer explica cómo crear casos de prueba dinámicamente.¿Qué hace el auto lambda: do
código de la respuesta:
class Tests(unittest.TestCase):
def check(self, i, j):
self.assertNotEquals(0, i-j)
for i in xrange(1, 4):
for j in xrange(2, 6):
def ch(i, j):
return lambda self: self.check(i, j)
setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))
que he probado y funciona, pero no puedo averiguar cómo ?
tengo problemas para entender la magia lambda self:
en juego aquí, principalmente:
- ¿Está la lambda se usa aquí para realizar exactamente lo contrario de
functools.partial()
(es decir, para crear una función de contenedor con una parámetro adicional que es aún no se conoce) - ¿Es
self
una palabra clave significativa olambda spam
funcionaría igual de bien? - ¿Qué punto es que se evaluó lambda?
- ¿Por qué el
.check()
está perfectamente bien fuera del alcanceclass
? - ¿Cómo se hace esto sin lambda? - si he entendido bien, you should be able to do without
lambda
(por no hablar de que estoy de acuerdo con Guido y Alex que es desagradables a la vista y yo quiero que prescindir :)
ok "No realmente. Simplemente llama al método check (i, j) sobre lo que se da como argumento. Esto se usa aquí para agregar métodos dinámicamente a la clase Tests". fue lo que no me di cuenta. Ahora que lo mencionas, es evidente (juego de palabras) – Kimvais
La modificación methodcaller (que también haría el código más legible, IMO) me da 'TypeError: methodcaller esperaba 1 argumentos, obtuvo 0' – Kimvais
@Kimvais: Esto es muy extraño. Parece que la función no está vinculada correctamente cuando se asigna al atributo de clase. Esto podría deberse al hecho de que no es una lambda real, sino una función definida en el lado C de Python. Supongo que abriré una pregunta por separado para eso. –