This answer spiega come creare i casi di test in modo dinamico.Cosa fa il lambda: do
codice della risposta:
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))
ho provato e funziona, ma non riesco proprio a capire come ?
ho difficoltà a capire il lambda self:
magia in gioco qui, principalmente:
- È lambda usata qui per effettuare l'esatto opposto di
functools.partial()
(cioè per creare una funzione wrapper con un più parametro che è non ancora noto) - È
self
una parola chiave significativa o sarebbelambda spam
funzionerebbe altrettanto bene? - Che punto è valutato Lambda?
- Come mai il
.check()
sta perfettamente bene fuori dall'ambitoclass
es? - Come si fa questo senza lambda? - se ho capito bene, you should be able to do without
lambda
(per non parlare che sono d'accordo con Guido e Alex che è un pugno nell'occhio e mi voglio fare a meno :)
ok "Non proprio, chiama solo il metodo check (i, j) su qualunque argomento viene fornito come argomento, utilizzato qui per aggiungere dinamicamente i metodi alla classe Tests." era la cosa che non avevo capito. Ora che ne parli, è ovvio (gioco di parole) – Kimvais
La modifica di methodcaller (che renderebbe anche il codice più leggibile, IMO) mi dà 'TypeError: methodcaller ha previsto 1 argomenti, ottenuto 0' – Kimvais
@Kimvais: Questo è molto strano. Sembra che la funzione non sia legata correttamente quando assegnata all'attributo class. Ciò potrebbe essere dovuto al fatto che non è un vero lambda, ma una funzione definita sul lato C di Python. Immagino che aprirò una domanda a parte per quello. –