Choisi par Google comme l'un de ses langages piliers et utilisé dans des projets d'envergure tels que YouTube, Python est omniprésent dans les applications web modernes. Open Source et portable, sa modularité et son orientation objet permettent de créer des applications de toutes tailles, génériques et maintenables. Python : de la syntaxe à l'optimisation Python est tout indiqué pour le développement d'applications web : serveurs de contenu, moteurs de recherche, agents intelligents, objets distribués... Il est également performant pour réaliser des scripts d'administration système ou d'analyse de fichiers textuels, pour gérer l'accès à des bases de données, pour servir de langage glu entre plusieurs applications, réaliser des applications graphiques classiques, etc. Pour autant, le développeur n'exploitera vraiment sa puissance qu'en ayant acquis une certaine culture. C'est ce que ce livre permet d'acquérir par la description de techniques éprouvées dans tous les grands projets de développement en Python. Au-delà de la prise en main (installation des environnements d'exécution et de développement, rappels de syntaxe avec les primitives et la bibliothèque standard), cet ouvrage aborde les bonnes pratiques de développement Python, depuis les conventions de nommage et les design patterns objet les plus courants jusqu'à la programmation dirigée par les tests et l'optimisation de code. Enrichie en nouveaux cas pratiques et exercices, cette édition mise à jour pour Python 2.6 détaille également le script de migration 2to3 vers Python 3 et présente la bibliothèque ctypes qui permet de manipuler les structures de données en C/C++. À qui s'adresse cet ouvrage? Au développeur souhaitant s'initier à un nouveau langage et réaliser des applications web ; Aux développeurs Python souhaitant aller plus loin dans les bonnes pratiques de développement (programmation orientée objet, performances, tests unitaires...). Choisir Python 8 Table des matières 12 Avant-propos 32 Pourquoi ce livre ? 32 À qui s’adresse l’ouvrage ? 33 Guide de lecture 34 Remerciements 34 Première partie - Découverte de Python 38 1 - Introduction 40 Python ? 40 Du code de qualité 41 Orienté objet 41 Portable 41 Facile à intégrer 42 Hautement productif 42 Dynamique 43 Python et les autres langages 43 Python et Perl 44 Ruby, PHP, Java... 44 2 - Python pour quels usages ? 46 Administration système 47 Des API simples et efficaces 47 Manipuler des fichiers et des dossiers 47 Manipuler des programmes 48 Envoyer et recevoir des courriers électroniques 50 Échanger des informations avec d’autres systèmes 52 Le match Perl-Python 54 Syntaxe 54 Structures de données 55 Manipulation de texte 56 Conclusion 57 Prototypage rapide d’applications 57 Objectif d’une maquette 57 Maquette d’interfaces 58 Maquette de bibliothèque ou Fake 59 Exemple de prototype de bibliothèque 59 Recherche et calcul scientifique 61 Pas de paradigme imposé 61 Facilité de prise en main 61 Création ou utilisation d’outils spécialisés 61 Applications de gestion 62 Conception d’interface utilisateur 62 Stockage de données 63 Sérialisation des objets 63 Les bases de données relationnelles 65 Applications web 66 En un mot... 67 3 - Environnement de développement 68 Installation sous Linux 68 Installation par distribution 69 Paquets Debian 69 Paquets RedHat 70 Distributions Mandrake et Fedora Core 70 Compilation des sources 70 Étapes d’installation 71 Options de compilation 71 Compilation et installation de Python 73 Gérer plusieurs versions de Python 74 Installation sous MS-Windows 74 Installation sous Mac OS X 76 Premiers tests de Python en mode interactif 76 Script de démarrage du mode interactif 77 Le choix d’un éditeur 78 La coloration syntaxique 79 La standardisation automatique 80 Les raccourcis clavier et les macros 80 L’édition multiple 80 Le repliement de code et la recherche 80 L’autocomplétion 80 L’interpréteur et le débogueur embarqués 81 La licence 81 Les plates-formes reconnues 81 En un mot... 83 Deuxième partie - Éléments du langage 84 4 - Syntaxe du langage 86 L’instruction print 87 print devient fonction 87 Les commentaires 89 Modèle de données 89 Les littéraux 91 Littéraux alphanumériques 91 Normes ASCII et Unicode 92 Évolution de l’Unicode de Python 2 à Python 3 93 Caractères spéciaux 94 Littéraux numériques 95 Littéraux pour les entiers 96 Littéraux pour les valeurs à virgule flottante 98 Littéraux pour les nombres complexes 99 Les types standards 99 Les types à valeur unique 100 None 100 NotImplemented 100 Ellipsis 101 Les nombres 101 Les nombres entiers 101 Les nombres à virgule flottante 102 Les nombres complexes 103 Les décimaux 103 Les séquences 103 Les séquences immuables 104 Les séquences modifiables 109 Les mappings 113 Les opérateurs 118 Opérateurs de base 118 Autres opérateurs 119 Modulo 119 Négation 120 Inversion 120 Puissance 120 Appartenance 120 Opérateurs binaires 122 Opérateurs de comparaison 122 Principes de la comparaison 123 Ordre de traitement des opérations 123 Construction de comparaisons complexes 124 L’indentation 124 Les structures conditionnelles 125 L’instruction if 126 L’instruction for..in 126 L’instruction while 128 L’instruction with 129 En un mot... 132 5 - Structuration du code 134 Fonctions 134 Contexte d’exécution et directive global 135 Directive return 136 Paramètres d’une fonction 137 Paramètres explicites et valeurs par défaut 137 Les paramètres non explicites 139 Les paramètres arbitraires 140 Collisions de paramètres 141 Signatures multiples de fonctions 141 Directive lambda 142 Documentation strings (docstrings) 142 Decorators 143 Classes 148 Définition 148 Espace de noms 149 Paramètre self 150 Héritage 150 Héritage multiple 151 Surcharge des attributs 152 Constructeur et destructeur 153 Attributs privés 154 Méthodes spéciales 156 Représentation et comparaison de l’objet 156 Utilisation de l’objet comme fonction 158 Accès aux attributs de l’objet 158 Utilisation de l’objet comme conteneur 159 Utilisation de l’objet comme type numérique 161 New-style classes 163 Le nouveau Method Resolution Order 164 Constructeur statique 165 Surcharge de type() par metaclass 166 Descriptors 167 Properties 168 Slots 169 Decorators pour les classes 170 Modules 170 Directive import 171 Primitive reload 172 Directives from et as 173 Paquets 174 Organisation d’un paquet 174 Import * et __all__ 175 Références relatives 176 Exceptions 176 Exceptions du langage 177 Classes d’exceptions de base 178 Classes concrètes 179 try..except..else 179 try..finally 181 try..except..finally 181 Les list comprehensions 182 Generators et iterators 184 Iterators 184 Generators 185 Generator expression (genexp) 186 En un mot... 187 6 - Les primitives 188 Primitives du langage 189 __import__ : __import__(nom, globals={}, locals={}, fromlist=[], level=- 1) -> module 189 abs : abs(nombre) -> nombre 190 all : all(iterable) -> booléen 190 any : any(iterable) -> booléen 190 apply : apply(objet[, args[, kwargs]]) -> valeur 191 callable : callable(objet) -> booléen 191 chr : chr(code) -> caractère 191 classmethod : classmethod(fonction) -> méthode 191 cmp : cmp(x, y) -> entier 193 coerce : coerce(x, y) -> (x1, y1) 193 compile : compile(source, fichier, mode[, flags[, dont_inherit]]) -> objet code 194 delattr : delattr(objet, nom) 195 dir : dir([objet]) -> liste d’attributs 195 divmod : divmod(x, y) -> (division entière, modulo) 197 enumerate : enumerate(iterable) -> indice, élément 197 eval : eval(source[, globals[, locals]]) -> valeur 197 execfile : execfile(filename[, globals[, locals]]) 198 exit : exit -> string 198 file : file(nom[, mode[, buffering]]) -> objet file 198 filter : filter(fonction ou None, séquence) -> list, tuple, ou string 200 getattr : getattr(objet, nom[, défaut]) -> valeur 201 globals : globals() -> dictionnaire 201 hasattr : hasattr(objet, nom) -> booléen 202 hash : hash(objet) -> integer 202 help : Fonction d’aide en ligne 202 hex : hex(nombre) -> représentation hexadécimale 203 id : id(objet) -> entier 203 input : input([prompt]) -> valeur 204 int : int(x[, base]) -> entier 204 intern: intern(string) -> string 204 isinstance : isinstance(objet, classe ou type ou tuple) -> booléen 205 issubclass : issubclass(C, B) -> bool 205 iter : iter(collection) -> iterateur ou iter(callable, sentinelle) -> iterateur 206 len : len(objet) -> entier 206 license : license() -> prompt interactif 207 list : list() -> nouvelle liste ou list(sequence) -> nouvelle liste 208 locals : locals() -> dictionnaire 208 map : map(fonction, séquence[, séquence...]) -> liste 208 max : max(séquence) -> valeur 209 min : min(séquence) -> valeur 209 oct : oct(nombre) -> représentation octale. 210 open : open(nom[, mode[, buffering]]) -> objet file 210 ord : ord(caractère) -> entier 210 pow : pow(x, y[, z]) -> nombre 211 property : property(fget=None, fset=None, fdel=None, doc=None) -> attribut propriété 211 quit : quit -> string 212 range : range([start,] stop[, step]) -> liste d’entiers 212 raw_input : raw_input([prompt]) -> string 213 reduce : reduce(fonction, séquence[, initial]) -> valeur 214 reload : reload(module) -> module 214 repr : repr(objet) -> représentation 214 round : round(nombre[, ndigits]) -> réel 215 set : set(iterable) -> objet de type set 215 setattr : setattr(objet, nom, valeur) 216 slice : slice([start,] stop[, step]) 216 sorted : sorted(iterable, cmp=None, key=None, reverse=False) -> liste triée 217 staticmethod : staticmethod(fonction) -> méthode statique 218 str : str(objet) -> représentation de l’objet 219 sum : sum(sequence, start=0) -> valeur 219 super : super(type, objet) -> objet super lié à l’objet 220 type : type(objet) -> type de l’objet 221 type : type(nom, bases, dict) -> nouveau type 221 unichr : unichr(i) -> caractère unicode 222 unicode : unicode(string [, encoding[, errors]]) -> objet 222 vars : vars([objet]) -> dictionnaire 223 xrange : xrange([start,] stop[, step]) -> itérateur 223 zip : zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0]...), (...)] 223 Exceptions du langage 224 Erreurs 224 AssertionError 224 AttributeError 225 EOFError 225 FloatingPointError 225 IOError 225 ImportError 226 IndentationError 226 IndexError 226 KeyError 226 KeyboardInterrupt 227 MemoryError 227 NameError 227 NotImplementedError 227 OSError 228 OverflowError 228 ReferenceError 228 RuntimeError 228 StopIteration 228 SyntaxError 228 SystemError 229 SystemExit 229 TabError 229 TypeError 229 UnboundLocalError 230 UnicodeEncodeError 230 UnicodeDecodeError 230 UnicodeTranslateError 231 ValueError 231 WindowsError 231 ZeroDivisionError 231 Avertissements 231 UserWarning 232 DeprecationWarning 232 FutureWarning 232 OverflowWarning 232 PendingDeprecationWarning 232 RuntimeWarning 233 SyntaxWarning 233 En un mot... 233 7 - Conventions de codage 234 Mise en page du code 235 Indentation 235 Taille maximum d’une ligne 235 Commentaires 236 Commentaires simples 237 Commentaires en fin de ligne 237 Blocs de commentaires 237 Documentation strings ou docstrings 238 Espacement du code 239 Espaces dans les expressions et définitions 240 Conventions de nommage 241 Modules 242 Classes 243 Fonctions et variables globales d’un module, méthodes et attributs d’une classe 243 Constantes 244 Structure d’un module 244 En-tête 244 Interpréteur 244 Encodage 244 Copyright et licence 245 Tags 245 Docstring de module 245 Variables globales spécifiques 246 Clauses d’importations 246 Les jokers 246 Organisation des clauses 247 Variables globales 248 Fonctions et classes, le corps du module 248 Structuration d’une classe 248 Conseils pour le choix des noms 249 Règles générales 249 Du sens 249 Choix de la langue 250 Unicité des noms 250 La bonne longueur 250 Éviter le mélange domaine/technique 250 Règles pour chaque type 250 Modules 250 Classes 251 Méthodes et fonctions 251 Variables 252 En un mot... 252 Troisième partie - La bibliothèque standard 254 8 - Principaux modules 256 Interaction avec l’interpréteur 257 sys 257 argv 257 executable 257 exc_info()->infos 257 exit() 257 modules 258 last_type, last_value, last_traceback 258 path 258 platform 258 stdin, stdout et stderr 259 Accès au système 259 os 260 Opérations sur les descripteurs de fichiers 260 Manipulation des fichiers et répertoires 262 Manipulation des processus 270 Informations sur le système 276 subprocess 278 call(*args, **kwargs) -> code de retour 278 class Popen 278 os.path 280 platform 282 Utilitaires fichiers 284 shutil 284 copy(src, dst) 284 copy2(src, dst) 284 copytree(src, dst[, symlinks [, ignore]]) 284 rmtree(chemin, [ignore_errors[, onerror]]) 285 move(src, dst) 285 dircache 286 filecmp 286 cmp(f1, f2[, shallow=True[, use_statcache]]) ->booléen 286 class dircmp(a, b[, ignore[, hide]]) -> instance 286 Outils de compression 288 gzip 288 class GzipFile([filename[, mode[, compresslevel[, fileobj]]]]) 288 open(fichier[, mode[, compresslevel]]) 289 zipfile 291 class ZipFile(fichier[, mode[, compression]]) 291 class ZipInfo([fichier[, date_time]]) 293 is_zipfile(fichier) -> booléen 293 Programmation réseau 293 urllib2 294 ftplib 297 En un mot... 300 9 - Principaux modules, partie 2 302 Persistance 302 cPickle 303 dump(objet, fichier[, protocol]) 303 load(fichier) -> objet 303 dumps(objet[, protocole]) -> chaîne 304 loads(chaîne [, protocole]) -> objet 304 shelve 305 open(nom_fichier[, flag[, protocole[, writeback]]]) 306 Conversion, transformation de données 307 base64 307 b64encode(chaîne[, altchars]) -> chaîne 307 b64decode(chaîne[, altchars]) -> chaîne 307 haslib 308 haslib.md5 308 class md5([chaîne]) 309 hashlib.sha 309 Calculs numériques 310 math 310 fonctions de conversion 310 fonctions trigonométriques 311 constantes 312 Structures de données 313 array 313 array(typecode[, initializer]) -> tableau 313 abc 315 collections 318 Le type deque 318 Le type defaultdict 319 La fonction namedtuple 321 Les Abstract Base Classes 321 decimal 322 class Decimal([value [, context]]) 322 cStringIO 323 class StringIO([buffer]) 323 Utilitaires divers 323 atexit 324 pdb 325 Le mode pas-à-pas 325 Alias et fichier .pdbrc 329 Le mode post mortem 330 getpass 331 copy 332 difflib 333 Affichage des différences 333 Restauration 335 time 336 Epoch 336 UTC/GMT 336 Fonctions de manipulation 337 Formatage des dates 338 datetime 340 class timedelta(weeks, days, minutes, hours, seconds, microsecondes, milliseconds) 340 class date 341 class time 343 class datetime 345 random 345 En un mot... 346 10 - Principaux modules, partie 3 348 Le module itertools 348 chain(*itérables) -> itérateur 348 count([premier_entier]) -> itérateur 349 cycle(itérable) -> itérateur 349 dropwhile(prédicat, itérable) -> itérateur 350 groupby(itérable[, keyfunc]) -> itérateur 350 ifilter(prédicat, itérable) -> itérateur 351 ifilterfalse(prédicate, itérable) -> itérateur 351 imap(fonction, *itérables) -> itérateur 352 islice(itérable, [start,] stop [, step]) -> itérateur 352 izip(*itérables) -> itérateur 352 izip_longest(*itérables, [fillvalue=None]) -> itérateur 353 repeat(élément, nb_occurences) -> itérateur 353 starmap(fonction, séquence) -> itérateur 353 takewhile(prédicat, itérable) -> itérateur 354 tee(itérable[, n=2]) -> tuple d’itérateurs 354 Le module re 354 Expressions régulières ? 354 Notation pour les expressions régulières 356 Syntaxe des expressions régulières 356 Symboles simples 356 Symboles de répétition 358 Symboles de regroupement 360 Exemples plus complets 361 Fonctions et objets de re 362 Le module Tkinter 365 Programmation événementielle 365 La classe Tk 365 Les widgets de base de Tkinter 366 Positionnement d’un widget 367 Options et méthodes d’un widget 368 Binding d’événements 376 Application type avec Tkinter 378 Extensions pour Tkinter 380 Le module lib2to3 et le script 2to3 380 En un mot... 382 11 - Exercices corrigés 384 Mode d’emploi du chapitre 384 Programme 385 Exercice 1 : programme paramétrable 385 Description 385 Points abordés 385 Solution 385 Discussion 386 Extension 388 Texte 388 Exercice 2 : le chiffrement de César 388 Description 388 Points abordés 389 Solution 389 Discussion 389 Extension 390 Exercice 3 : transformer les adresses e-mails et les URL d’un texte en liens 390 Description 390 Points abordés 391 Solution 391 Discussion 391 Extension 392 Exercice 4 : trier des phrases suivant le nombre de mots 393 Description 393 Points abordés 393 Solution 393 Discussion 394 Extension 394 Fichiers 395 Exercice 5 : recherche et remplacement de texte 395 Description 395 Points abordés 395 Solution 395 Discussion 396 Extension 397 Exercice 6 : recopie conditionnelle et récursive de fichiers 397 Description 397 Points abordés 397 Solution 397 Discussion 398 Exercice 7 : ajout d’un fichier dans une archive zip 398 Description 398 Points abordés 398 Solution 398 Discussion 399 Extension 400 Threads et processus 401 Exercice 8 : Tkinter, recherche d’un texte dans des fichiers en tâche de fond 401 Description 401 Points abordés 401 Solution 401 Discussion 405 Extension 405 Exercice 9 : Un web spider rapide 406 Description 406 Points abordés 406 Solution 406 Discussion 408 Extension 408 Persistance 409 Exercice 10 : rendre persistants tous les objets d’un programme 409 Description 409 Points abordés 409 Solution 409 Discussion 410 Extension 411 Web et réseau 411 Exercice 11 : vérificateur de liens 411 Description 411 Points abordés 412 Solution 412 Discussion 412 Extension 412 Exercice 12 : aspirateur de page web 412 Description 412 Points abordés 413 Solution 413 Discussion 415 Extension 416 Exercice 13 : récupération d’un résumé des nouveaux e-mails reçus 416 Description 416 Points abordés 416 Solution 416 Discussion 418 Extension 419 Divers 419 Exercice 14 : système de documentation en ligne des modules 419 Description 419 Points abordés 419 Solution 419 Discussion 420 Extension 421 En un mot... 421 Quatrième partie - Techniques avancées 422 12 - Programmation dirigée par les tests 424 À quoi servent les tests ? 425 Barrière culturelle 425 Principes 426 Tests unitaires 426 Construction d’un test unitaire 427 Évolution des use cases 428 Non-régression 429 Regroupement des tests 431 Tests plus complexes : raconter une histoire 431 Les bouchons 432 Test coverage 437 Qualité des tests 437 Tests fonctionnels 438 Tests de l’interface 438 Tests de l’ergonomie 439 Dépendance forte à l’outil utilisé et au type d’interface 439 Outils 440 unittest 440 Définition des test cases 441 Organisation d’une campagne de tests 444 doctests 448 Exécution des doctests 448 Syntaxe des doctests 449 Environnement et options d’exécution 452 doctests dans un fichier texte séparé 457 Script de test 460 Coverage 461 Intégration dans l’environnement d’un projet 464 Le futur de PyUnit 465 En un mot... 467 13 - Bonnes pratiques et optimisation du code 468 Quand optimiser ? 469 Profiling 469 Méthodes de profiling 470 Outils de profiling 470 Le module profile 470 Le module hotshot 471 Le module cProfile 472 Le module pstats 473 hotshot et pstats 474 timeit 475 Amélioration des performances 477 Code patterns 478 Quel type de conteneur choisir ? 478 Trier des valeurs 478 Concaténer des chaînes 481 Remplacer certains tests par une gestion d’exception 482 Minimiser les appels et rapprocher le code 483 Utiliser les list comprehensions 485 Utiliser les generators et les genexp 486 Préférer les fonctions d’itertools 486 Caching 487 Multithreading 489 Ressources partagées : difficultés de programmation 489 Le module threading 491 Le module Queue 499 Le Global Interpreter Lock et multiprocessing 500 Le côté obscur de la force : extension du langage 501 Environnement de compilation 501 Binding de bibliothèque 502 Création d’un module d’extension 506 Optimisation de l’utilisation de mémoire vive 512 Économie de mémoire 513 Optimisation du bytecode 514 Psyco et Cython 514 Psyco 514 Cython 516 Les tests de performance continus 517 Rapport sur les performances 518 Tests de performance ciblés 518 decorator timed 519 En un mot... 522 14 - Programmation orientée objet 524 Principes généraux 524 Typage, classification et encapsulation 525 Typage de Liskov 525 Encapsulation 527 Héritage et polymorphisme 529 Héritage 529 Polymorphisme 530 Duck typing et interfaces 532 Relations entre objets 533 Relation simple 534 Relation multiple 534 Héritage multiple 535 Métaclasses 536 Garbage collecting 536 Design patterns orientés objet 537 Patterns de génération d’objets 537 Singleton et Borg 538 Factory 541 Patterns fonctionnels 542 Visitor 542 Observer 544 Memento 547 Chain of responsibility 550 State 553 Patterns structurels 555 Adapter 555 Facade 557 Proxy 558 En un mot... 559 A - L’histoire de Python 560 Le langage ABC 560 Environnement de développement 560 Types de données 561 Indentation du code 561 Le projet Amoeba 562 Le CNRI 563 PythonLabs et BeOpen.com 563 Python Software Foundation et Digital Creations 564 Python et Zope 564 B - Bibliothèques tierces 568 Installer une bibliothèque externe 569 Utilisation de setuptools 570 Bases de données 572 Gadfly 572 pysqlite 572 mysql-python 572 psycopg 573 ODBC 573 python-ldap 573 SQLAlchemy 573 Traitement de texte 573 lxml 574 Beautiful Soup 574 Packaging, distribution 574 Tests fonctionnels et contrôle qualité 575 Twill 575 Funkload 575 guitest 575 PyLint 576 Pyflakes 576 MS-Windows 576 Win32 Extensions 576 win32com 577 Interfaces graphiques 577 wxPython 577 PyQT 577 PyGTK 577 Reporting et conversion 578 ReportLab 578 RML2PDF 578 reStructuredText 578 rest2web 579 Jeux et 3D 579 Pygame 579 Soya 3D 579 vpython 579 PyOpenGL 580 Audio et Vidéo 580 PyMedia 580 PyAlsa 580 Bibliothèques scientifiques 580 Numerical Python 581 SciPy 581 Biopython 581 Web 581 C - Sites, flux RSS, blogs et autres friandises... 582 Flux RSS 582 Blogs 583 Sites 584 Index 586 Symboles 586 Numeriques 586 A 586 B 586 C 586 D 587 E 587 F 588 G 588 H 588 I 588 J 589 K 589 L 589 M 589 N 590 O 590 P 590 Q 591 R 591 S 591 T 592 U 592 V 592 W 593 X 593 Y 593 Z 593