Ho un oggetto con una connessione al database interno attiva per tutta la sua durata. Alla fine dell'esecuzione del programma, la connessione deve essere confermata e chiusa. Finora ho usato un metodo esplicito close
, ma questo è piuttosto complicato, specialmente quando possono verificarsi eccezioni nel codice chiamante.Pulizia di una connessione interna di pysqlite sulla distruzione di oggetti
Sto valutando l'utilizzo del metodo __del__
per la chiusura, ma dopo alcune letture online ho dei dubbi. È un modello di utilizzo valido? Posso essere sicuro che le risorse interne saranno liberate in __del__
correttamente?
This discussion ha sollevato una domanda simile ma non ha trovato risposta soddisfacente. Non voglio avere un metodo esplicito close
e usare with
non è un'opzione, perché il mio oggetto non è usato semplicemente come open-play-close, ma è conservato come membro di un altro oggetto più grande, lo usa mentre è in esecuzione in una GUI.
C++ ha distruttori perfettamente funzionanti in cui è possibile liberare risorse in modo sicuro, quindi immagino che Python abbia qualcosa d'accordo. Per qualche motivo sembra non essere il caso, e molti nella comunità giurano contro __del__
. Qual è l'alternativa, allora?
Non è questo tipo di disordinato in un modo di "astrazione sfuggente" per l'oject che usa tale connessione? Perché non posso usare solo un distruttore come in C++ ?? –
@eliben: può. Tuttavia i distruttori non vanno bene con i garbage collector ei riferimenti circolari (è necessario rimuovere il riferimento circolare da soli prima che venga chiamato il distruttore) e la connessione nell'applicazione sembra una singola istanza (singleton) che un modulo globale fornisce bene. Se questo non è il caso (hai bisogno di più connessioni) allora puoi andare per un distruttore. Basta non tenere i riferimenti circolari in giro o dovrai romperli da solo. – nosklo
I distruttori di re C++, non esattamente. Codificando con RAII corretto, il puntatore alla risorsa verrebbe tenuto come un puntatore intelligente (magari conteggiato come riferimento) che viene deallocato automaticamente quando il conteggio raggiunge 0 in modo garantito. Tuttavia, ciò richiede un macchinario aggiuntivo (il puntatore intelligente) e anche –