Vantaggi dell'uso della libreria PyContracts su affermazioni asserite

6

Oggi mi sono imbattuto nel pacchetto Python chiamato PyContracts . Comunque, python ha l'istruzione assert che sembra permetterti di fare esattamente queste cose. Quali vantaggi hanno i contratti rispetto alle asserzioni?

    
posta Chiel ten Brinke 08.03.2014 - 22:35
fonte

1 risposta

3

Grazie per aver sottolineato l'esistenza di questo interessante modulo Python. L'ho verificato e, in breve, PyContracts è molto di livello superiore e potente di semplici asserzioni integrate, per il controllo dei parametri e dei tipi di funzione.

Prendendo esempio dalla documentazione stessa, di seguito, "PyContracts è abbastanza intelligente per verificare che i due parametri a e b siano matrici di dimensioni compatibili. "

@contract
def matrix_multiply(a,  b):
    ''' Multiplies two matrices together.'''
    return numpy.dot(a, b)

Si noti che l'unica istruzione aggiunta è @contract mentre, se si utilizza un'asserzione, si dovrebbe confrontare esplicitamente le dimensioni! Ad esempio:

assert a.shape == b.shape

Il prossimo esempio, di nuovo dal tour, "controlla che le due liste aeb abbiano elementi dello stesso tipo (indicati dalla variabile x) e anche che l'elenco restituito abbia la dimensione corretta (la somma dei due lunghezze)! "

@contract(      a='list[ M ](type(x))',
                b='list[ N ](type(x))',
           returns='list[M+N](type(x))')
def my_cat_equal(a, b):
    ''' Concatenate two lists together. '''
    return a + b

Abbastanza sorprendente. Di nuovo quanto sopra potrebbe essere fatto usando solo asserzioni, ma sarebbe molto più complicato! PyContracts riguarda semplificare e rendere più leggibile il codice.

D'altra parte, questo chiaramente non sostituisce la necessità di asserzioni all'interno del corpo di una funzione o metodo. Quindi i due sono strumenti complementari ...

    
risposta data 01.04.2014 - 22:50
fonte

Leggi altre domande sui tag