Sto avendo difficoltà funzioni Python di test che restituiscono un iterabile, come le funzioni che sono cedere o funzioni che semplicemente restituiscono un iterabile, come return imap(f, some_iter)
o return permutations([1,2,3])
.Funzioni di test iterable restituendo in python
Quindi, con l'esempio delle permutazioni, mi aspetto che l'uscita della funzione sia [(1, 2, 3), (1, 3, 2), ...]
. Quindi, inizio a testare il mio codice.
def perm3():
return permutations([1,2,3])
# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])
Questo non funziona, dal momento che è un perm3()
iterabile, non una lista . Quindi possiamo risolvere questo particolare esempio.
def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])
E questo funziona bene. Ma cosa succede se ho nested iterables? Questo è iterables che restituiscono iterabili? Come dire le espressioni product(permutations([1, 2]), permutations([3, 4]))
. Ora questo è probabilmente non utile ma è chiaro che sarà (una volta srotolato gli iteratori ) qualcosa come [((1, 2), (3, 4)), ((1, 2), (4, 3)), ...]
. Tuttavia, non possiamo semplicemente avvolgere lo list
intorno al nostro risultato, dato che sarà solo trasformare iterable<blah>
in [iterable<blah>, iterable<blah>, ...]
. Bene Certo che posso fare map(list, product(...))
, ma questo funziona solo per un livello nidificazione di 2.
affermativo, la comunità di testing pitone avere alcuna soluzione per i problemi durante il test iterabili? Naturalmente alcuni iterables non possono essere testati in questo modo , come se si volesse un generatore infinito, ma ancora questo problema dovrebbe essere abbastanza comune per qualcuno che abbia pensato a questo .
Lo accetterò perché è buono come la risposta di dbw. Diversamente dalla mia risposta puoi mescolare le 'tuple' /' lists'. Questa risposta è anche solo eseguibile in copia-incolla. :) Ma! Sarei più soddisfatto se ci fosse una risposta in cui tu (1) controlli effettivamente che restituisce un iterabile (cambia le permutazioni di ritorno ([1,2,3]) 'alla lista di ritorno (permutazioni ([1,2,3 ])) 'non dovrebbe passare ** e ** (2) il valore atteso annidato dovrebbe avere i tipi corretti.Questo sta cambiando una delle tuple in una lista non dovrebbe passare (cambia' (2, 3, 1) 'a' [2, 3, 1] '). – Tarrasch
Ah. Giusto, suppongo di solito evitare i tipi di test e provare a testare le interfacce. In questo modo i dettagli di implementazione cambiano in qualche modo, pur continuando a produrre gli stessi dati/risultati – dbn