Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Pierre Maurette Newsgroups: fr.comp.lang.python Subject: Re: manipulation d'image Date: Thu, 15 Aug 2019 07:33:37 +0200 Organization: A noiseless patient Spider Lines: 71 Message-ID: References: Reply-To: maurette.pierre@free.fr Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15"; format=flowed Content-Transfer-Encoding: 8bit Injection-Info: reader02.eternal-september.org; posting-host="4a0eb70419a3213996ca147798a3d618"; logging-data="26901"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX198uOZz14UTbNhB8WDRC45o4n7+uBaEu8o=" Cancel-Lock: sha1:skwkv7KfSSjfk8VaDfnTl6OJZPU= X-Newsreader: MesNews/1.08.06.00-fr X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~ Xref: csiph.com fr.comp.lang.python:3221 Lulu : [...] Quelques indications qui devraient vous permettre de répondre vous-même à vos questions. Pour la doc, vous devriez partir de la doc officielle: https://pillow.readthedocs.io/en/latest/ Vous voyez que Pillow est la distribution actuelle de l'historique bibliothèque PIL (Pillow est un nom "commercial", c'est bien sous le nom de PIL qu'elle sera importée, Pillow n'existe pas dans le code). Dans cette bibliothèque, une foule de modules, dont un nous intéresse particulièrement (et pour un temps exclusivement): Image : https://pillow.readthedocs.io/en/latest/reference/Image.html Dans ce module, des fonctions et une classe (un objet): Image. Dans la même page: https://pillow.readthedocs.io/en/latest/reference/Image.html#the-image-class C'est peut être confusant, mais en définitive logique. Un module: PIL.Image Une classe: PIL.Image.Image Parmi les fonctions du module (PIL.Image): open, new, etc. Parmi les fonctions (méthodes) de la classe (PIL.Image.Image): convert, putpixel, getpixel, etc. Donc, si je fais juste: from PIL import Image je n'ai importé que le module PIL.Image, en faisant simplement l'économie d'avoir à saisir PIL.Image au profit de Image. La classe PIL.Image.Image deviendra Image.Image, c'est tout. Je vais donc avoir: theimage1 = Image.open(blah) theimage2 = Image.new(blahblah) theimage1.putpixel(blah) theimage2.show() Mais je peux également faire: Image.Image.putpixel(theimage1, blah) Image.Image.show(theimage2) Cas particulier: Image._show(theimage2) fonctionne. C'est un peu un hasard (ne fonctionne pas pour _convert, qui n'existe pas), même si la pratique est habituelle. _show(unobjet) est une fonction utile au module PIL.Image, l'underscore indique qu'elle est vaguement "à usage interne" (peut-être héritée par PIL.Image.Image, peu importe en fait), elle ne sera pas importée avec *, ne sera pas documentée, etc. Mais reste parfaitement accessible. Un code qui utilise des écritures exotiques (les "mais je peux également...") masque un problème, et doit être corrigé. Pourquoi (par exemple) from PIL.Image import * est *réellement* bad ? PIL.Image.open() devient open(). Hors open() est une fonction native largement utilisée, elle sera masquée. Il ne sera pas rare d'avoir à l'utiliser dans un code incluant PIL.Image.open(). On peut bien sûr faire import builtins puis builtins.open(), il est clair que c'est débile, ça casse les habitudes, les templates, le copier-coller de code, ça fait chier le lecteur du code, et sans doute bien d'autres choses. -- Pierre Maurette