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?
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?
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 ...
Leggi altre domande sui tag python assertions design-by-contract