Ah mais quel boulet j'ai codé trop vite, bien vu ! et ça me fait gagner pas mal d'appels sur le profilage, c'est top !Citation:
Envoyé par wiztricks
Version imprimable
Ah mais quel boulet j'ai codé trop vite, bien vu ! et ça me fait gagner pas mal d'appels sur le profilage, c'est top !Citation:
Envoyé par wiztricks
Il me semblait bien moi aussi, qu'il était superflu ce decode('utf-8') :marteau:
C'est comme pour le "return" qui pose question dans le swinnen: ça fonctionne très bien sans... et si l'auteur avait pris le temps de se relire de façon critique, il l'aurait probablement supprimé. Mais de fait, après s'être usé les yeux à faire fonctionner un bout de code, il y a des détails qu'on ne voit plus: on sature.
Normal et pas si grave (la qualité militaire demande des moyens et un autre entrainement).
- W
Tu auras compris que c'était de l'humour de ma part pour illustrer mon incompétence. Je suis bien incapable de comprendre et de surcroit d'analyser le code que vous avez partagé dans cette discutions. :)
Je voulais juste raccrocher sur le sujet initial: quand non a commencé, on se posait aussi des questions sur les codes qu'on lisait... et suivant son niveau, on ne se posera pas les mêmes questions, on ne lira pas le code de la même façon,...
- W
En fait, ma réponse est incomplète !
Oui, un fichier est un itérateur
Mais, pour information, l'instruction with ne retourne pas obligatoirement l'objet passé à "with", et cet objet "interne" lui, peut-être un itérateur.Code:
1
2
3 fs = open("truc.txt") for ligne in fs: print("->", ligne)
Exemple:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class ParseurCle: def __init__(self, paragraphe: str): self.items = ( l.split("=")[0] for l in paragraphe.splitlines() if l and "=" in l ) def __enter__(self): return self.items # on retourne/consume ce Générateur def __exit__(self, *exc): return True texte = """ a = 1 b = 2 x c = 3 """ with ParseurCle(texte) as magique: for line in magique: # ici, en fait "magique" est "ParseurCle.items" et pas ParseurCle ! print("clé: ", line)
Il s'agit du bloc "with".
Ce bloc doit être associé à une ressource et garantit la libération de la ressource quand on le quitte.
Et cela peut s'appliquer à la majorité des ressources informatiques qui doivent être "ouvertes" pour y accéder puis être "refermées" en fin de travail (fichiers, base de données, socket, ...)Code:
1
2
3
4
5 with open(fichier, ...) as fp: # Ici le fichier est ouvert et est accessible via "fp" # Ici le fichier est ouvert et est accessible via "fp" # Ici le fichier est ouvert et est accessible via "fp" # Ici le fichier est automatiquement fermé (même pas besoin d'écrire fp.close())
Ensuite papajoker montre comment créer son propre "with" qu'il appelle "ParseurCle".
Cet objet se crée de façon classique (il te faudra apprendre l'objet pour connaître cette "façon classique") auquel on rajoute deux méthodes particulières :
- __enter__() qui est automatiquement appelée quand on appelle le with (là tu progammes l'ouverture de la ressource que tu veux offrir)
- __exit__() qui est automatiquement appelée quand on quitte le bloc (là tu programmes le nettoyage)
De là tout utilisateur pourra appeler with ParseurCle(data_a_traiter) as variable_pour_les_traiter et aura l'assurance qu'en quittant le bloc, les ressources qu'il aura pu "réserver" seront libérées.
C'est un poil plus clair.