[PYTHON] Différentes façons de détruire des ressources avec une portée

RAII(C++)

Voir de wikipedia. Le destructeur est appelé en détruisant la variable automatique et la ressource est fermée à ce moment-là. On suppose que l'API close ne lève pas d'exception. Comme le module de garde de perl.

void functionA()
{
    LogFile log("Output log of functionA");
 
    log.write("fun Step succeeded");
 
    // ...Continuer à utiliser le journal...
    //Qu'une exception soit levée ou qu'une fonction soit renvoyée, le handle du fichier journal est garanti d'être fermé.
}

avec clause (python)

Cela n'existait pas dans le passé, mais il a augmenté.

with open("hello.txt") as f:
    for line in f:
        print line

Recevoir proc (ruby)

Reçoit une fermeture et alloue et détruit des ressources avant et après l'exécution de la fonction.

open("foo.csv") {|file|
  while l = file.gets
    lines += 1
    fields += l.split(',').size
  end
}

clause using (C #)

Je veux voir c # avec.

//Si vous implémentez la méthode Dispose, vous pouvez l'utiliser après avoir quitté en utilisant

using (StreamWriter writer = 
                new StreamWriter("memo.txt", false, Encoding.UTF8))
{
    writer.Write("texte");
}

scope(D-lang)

La fonction après la portée est évaluée lors de l'échappement.

void abc()
{
    Mutex m = new Mutex;

    lock(m);	//Verrouiller le mutex
    scope(exit) unlock(m);	//Déverrouiller à la fin de la portée

    foo();	//Faites le traitement
}

defer(go-lang)

Similaire à la portée

    f, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer f.Close()  // f.La fermeture est exécutée à la fin

syntaxe try-with-resources (java)

Il ferme celui qui implémente l'interface AutoCloseable. (Merci à tsuyoshi_cho)

    public static void main(String[] args) {
        try (AutoCloseable imp = new AutoCloseableImpl()) { // New!
            System.out.println("hoge");
        } catch(Exception e) {
            System.out.println("catch:" + e);
        } finally {
            System.out.println("finally");
        }
    }

synchronized(Java) Vous pouvez gérer l'acquisition de verrous sur des objets avec la syntaxe.

class MyObject {
  int val;

  MyObject(int val) {
    this.val = val;
  }

  synchronized void setVal(int val) {
    this.val = val;
  }

  synchronized int getVal() {
    return val;
  }
}

Pour le moment, je l'ajouterai si je me souviens de quelque chose.

Recommended Posts

Différentes façons de détruire des ressources avec une portée
2 façons de gérer SessionNotCreatedException
Différentes façons de créer un dictionnaire (mémoires)
4 façons de gérer les clés de dict manquantes
[Python] Compréhension de liste Différentes façons de créer une liste
Diverses méthodes pour extraire les colonnes du tableau NumPy
Essayez de le résoudre de différentes manières (SAT, CSP)
Convertir 202003 en 2020-03 avec les pandas
[Python] Différentes façons de générer des données avec Numpy (arange / linspace / logspace / zeros / ones / mgrid / ogrid)
Différentes barres de couleurs avec Matplotlib
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
Essayez d'afficher diverses informations utiles pour le débogage avec python