Python Guide FR
Python Guide FR
Version 0.0.1
Kenneth Reitz
12 August 2017
Table des matires
i
4.2 Geler votre code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
ii
Python Guide Documentation, Version 0.0.1
Nouveau sur Python ? Commenons par configurer correctement votre environnement Python.
Choisir un interprteur
Ltat de Python (2 vs 3)
Quand vous choisissez un interprteur Python, une question imminente est toujours prsente : Dois-je choisir Python
2 ou Python 3 ? La rponse nest pas toujours aussi vidente que lon pourrait penser.
Lessentiel retenir de ltat des choses est comme suivant :
1. Python 2.7 a t le standard depuis un temps assez long.
2. Python 3 a introduit des changements majeurs dans le langage, avec lesquels de nombreux dveloppeurs ne
sont pas contents.
3. Python 2.7 recevra des mises jour de scurit ncessaires jusquen 2020 5 .
4. Python 3 volue constamment, comme Python 2 la fait dans le pass.
Ainsi, vous pouvez maintenant voir pourquoi ce nest pas une dcision aussi facile.
Recommandations
3
Python Guide Documentation, Version 0.0.1
Ainsi... 3 ?
Si vous choisissez un interprteur Python utiliser, et que vous navez pas dopinions arrtes, alors je vous recom-
mande dutiliser la dernire version de Python 3.x, comme chaque version apporte des modules de la bibliothque
standard nouveaux et amliors, des corrections de bug et de scurit. Le progrs est le progrs.
Avec ces lments, utilisez seulement Python 2 si vous avez une raison importante pour cela, comme une biblio-
thque exclusive Python 2 qui na pas dalternative adquate disponible en Python 3 , ou vous (comme moi) adorez
absolument et tes inspirs par Python 2.
Consultez Can I Use Python 3? pour voir si un logiciel dont vous dpendez peut bloquer votre adoption de Python 3.
Plus de lecture (en)
Il est possible dcrire du code qui fonctionne sur Python 2.6, 2.7, et sur Python 3. Cela varie de problmes triviaux
difficile selon le genre de logiciel que vous crivez ; si vous tes un dbutant, il y a des choses beaucoup plus
importantes vous soucier.
Implmentations
Quand les gens parlent de Python, ils veulent souvent dire pas seulement le langage mais aussi limplmentation
Cython. Python est actuellement une spcification pour un langage qui qui peut tre implmente de multiples faons.
CPython
CPython est limplmentation de rfrence de Python, crite en C. Il compile le code Python en un bytecode interm-
diaire qui est ensuite interprt par une machine virtuelle. CPython fournit le plus important niveau de compatibilit
avec les paquets Python et les modules avec extension en C.
Si vous crivez du code Python open-source et que vous voulez toucher une audience la plus large possible, le ciblage
de CPython est le meilleur faire. Pour utiliser des paquets qui sappuient sur des extensions C pour fonctionner,
CPython est votre seule option de mise en uvre.
Toutes les versions du langage Python sont implmentes en C parce que CPython est limplmentation de rfrence.
PyPy
PyPy est un interprteur Python implment dans un sous-ensemble restreint statiquement typ du langage Python
appel RPython. Linterprteur se comporte comme un compilateur just-in-time (JIT) et supporte de multiples back-
ends (C, CLI, JVM).
PyPy a pour but une compatibilit maximum avec limplmentation de rfrence CPython tout en amliorant les
performances.
Si vous cherchez amliorer les performances de votre code Python, cela vaut la peine dessayer PyPy. Sur une suite
de benchmarks, il est actuellement plus de 5 fois plus rapide que CPython.
PyPy supporte Python 2.7. PyPy3 1 , sorti en bta, cible Python 3.
Jython
Jython est une implmentation Python qui compile du code Python en bytecode Java qui est ensuite excut par la
JVM (Java Virtual Machine). De plus, il est capable dimporter et dutiliser nimporte quelle classe Java comme un
module Python.
1. http://pypy.org/compat.html
Si vous avez besoin de vous interfacer avec une base de code Java existante ou avez dautres raisons dcrire du code
Python pour la JVM, Jython est le meilleur choix.
Jython supporte actuellement jusqu la version Python 2.7. 2
IronPython
IronPython est une implmentation de Python pour le framework .NET. Il peut utiliser la fois les bibliothques des
frameworks Python et .NET, et peut aussi exposer du code Python vers dautres langages dans le framework .NET.
Python Tools for Visual Studio intgre IronPython directement dans lenvironnement de dveloppement de Visual
Studio, ce qui le rend choix idal pour les dveloppeurs Windows.
IronPython supporte Python 2.7. 3
PythonNet
Python for .NET est un paquet qui fournit une intgration presque transparente dune installation native de Python
avec le Common Language Runtime (CLR) de .NET . Cest un approche inverse que celle qui est prise par IronPython
(voir ci-dessus), qui est plus complmentaire que concurrente de cette dernire.
En association avec Mono, PythonNet permet des installations natives de Python sur des systmes dexploitation non-
Windows, comme OS X et Linux, pour fonctionner dans le framework .NET. Il peut tre excut en plus dIronPython
sans conflit.
PythonNet supporte de Python 2.3 jusqu Python 2.7. 4
Installer Python correctement
Guides dinstallation
Ces guides passent en revue linstallation correcte de Python 2.7 pour des objectifs de dveloppement,
aussi bien que la configuration de setuptools, pip, et virtualenv.
Mac OS X.
Microsoft Windows.
Ubuntu Linux.
avant que vous dmarriez construire des applications Python pour un usage dans le monde rel. En par-
ticulier, vous devriez toujours installer Setuptools, comme il rend plus facile pour vous dutiliser dautres
bibliothques Python tierces.
La version de Python qui est livre avec OS X est bien pour apprendre mais elle nest pas adapte pour le
dveloppement. La version livre avec OS X peut tre dpasse par rapport la version officielle courante
de Python, qui est considre comme la version de production stable.
Note : Si vous avez dj Xcode install, ninstallez pas OSX-GCC-Installer. En association, le logiciel
peut causer des problmes qui sont difficiles diagnostiquer.
Note : Si vous effectuez une installation frache de Xcode, vous devrez aussi ajouter les outils de la ligne
de commande en excutant xcode-select --install dans le terminal.
Bien que OS X vienne avec de nombreux utilitaires UNIX, ceux familiers avec les systmes dexploitation
Linux remarquerons quun composant cl est manquant : un gestionnaire de paquet dcent. Homebrew
comblera ce manque.
Pour installer Homebrew, ouvrez le Terminal ou votre mulateur de terminal OSX favori et excutez
Ce script va expliquer quels changements il fera et vous demander avant que linstallation commence. Un
fois que vous avez install Homebrew, insrez le rpertoire Homebrew en haut de votre variable denviron-
nement PATH. Vous pouvez faire ceci en ajoutant la ligne qui suit la fin de votre fichier ~/.profile
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
Environnements virtuels
Un environnement virtuel est un outil pour garder les dpendances requises par diffrents projets dans des
emplacements spars, en crant des environnements virtuels Python pour eux. Il rsout le dilemme le
projet X dpend de la version 1.x mais le projet Y ncessite la 4.x, et garde votre rpertoire site-packages
global propre et grable.
Par exemple, vous pouvez travailler sur un projet qui ncessite Django 1.3 tout en maintenant aussi un
projet qui ncessite Django 1.0.
Pour commencer utiliser cela et plus dinformations : documentation sur les environnements virtuels.
Cette page est une version remixe dun autre guide, qui est disponible sous la mme licence.
Vous pouvez faire cela facilement en excutant ce qui suit dans powershell :
Le second rpertoire (Scripts) reoit des fichiers de commande quand certains paquets sont installs.
Cest ainsi un ajout trs utile. Vous naurez pas besoin dinstaller ou de configurer quoi que ce soit dautre
pour utiliser Python. Cela dit, je recommande fortement que vous installiez les outils et les bibliothques
dcrites dans la prochaine section avant que vous dmarriez construire des applications Python pour un
usage dans le monde rel. En particulier, vous devriez toujours installer Setuptools, comme il rend plus
facile pour vous dutiliser dautres bibliothques Python tierces.
Setuptools + Pip
Le logiciel tiers de Python le plus crucial de tous est Setuptools, qui tend les capacits de packaging et
dinstallation fournies par distutils dans la bibliothque standard. Une fois que vous avez ajout Setuptools
votre systme Python, vous pouvez tlcharger et installer nimporte quel produit logiciel conforme Py-
thon avec un seule commande. Setuptools vous permet de tlcharger et dinstaller nimporte quel logiciel
conforme Python via un rseau (gnralement Internet) avec une seule commande (easy_install).
Il vous permet aussi dajouter cette capacit dinstallation par le rseau votre propre logiciel Python avec
trs peu de travail.
Pour obtenir la dernire version de Setuptools pour Windows, excutez le script Python disponible ici :
ez_setup.py
Vous avez maintenant une nouvelle commande votre disposition : easy_install. Elle est considre
par beaucoup comme tant dprcie. Ainsi, nous allons installer son remplaant : pip. Pip permet la
dsinstallation de paquets et est activement maintenu, contrairement easy_install.
Pour installer pip, excutez le script Python disponible ici : get-pip.py
Environnements virtuels
Un environnement virtuel est un outil pour garder les dpendances requises par diffrents projets dans des
emplacements spars, en crant des environnements virtuels Python pour eux. Il rsout le dilemme le
projet X dpend de la version 1.x mais le projet Y ncessite la 4.x, et garde votre rpertoire site-packages
global propre et grable.
Par exemple, vous pouvez travailler sur un projet qui ncessite Django 1.3 tout en maintenant aussi un
projet qui ncessite Django 1.0.
Pour commencer utiliser cela et plus dinformations : documentation sur les environnements virtuels.
Cette page est une version remixe dun autre guide, qui est disponible sous la mme licence.
$ python --version
Quelques vieilles versions de RHEL et CentOS sont fournies avec Python 2.4 qui est inacceptable pour le
dveloppement Python moderne. Heureusement, il y a des paquets supplmentaires pour Enterprise Linux
qui incluent des paquets additionnels de haute qualit bass sur leurs versions quivalentes Fedora. Ce
dpt contient un paquet Python 2.6 conu spcifiquement pour tre install cte cte avec linstallation
systme Python 2.4.
Vous navez pas besoin dinstaller ou de configurer quoi que ce soit pour utiliser Python. Cela dit, je
recommande fortement que vous installiez les outils et les bibliothques dcrites dans la prochaine section
avant que vous dmarriez construire des applications Python pour un usage dans le monde rel. En
particulier, vous devriez toujours installer Setuptools et pip, comme ils rendent plus faciles pour vous
dutiliser dautres bibliothques Python tierces.
$ command -v pip
Pour installer pip, suivez le guide dinstallation pip officiel - cela installera automatiquement la dernire
version de setuptools.
Environnements virtuels
Un environnement virtuel est un outil pour garder les dpendances requises par diffrents projets dans des
emplacements spars, en crant des environnements virtuels Python pour eux. Il rsout le dilemme le
projet X dpend de la version 1.x mais le projet Y ncessite la 4.x, et garde votre rpertoire site-packages
global propre et grable.
Par exemple, vous pouvez travailler sur un projet qui ncessite Django 1.3 tout en maintenant aussi un
projet qui ncessite Django 1.0.
Pour commencer utiliser cela et plus dinformations : documentation sur les environnements virtuels.
Vous pouvez aussi utiliser virtualenvwrapper pour rendre plus facile la gestion des environnements vir-
tuels.
Cette page est une version remixe dun autre guide, qui est disponible sous la mme licence.
Cette partie du guide se concentre sur les bonnes pratiques pour crire du code Python.
Par structurer nous entendons les dcisions que vous faites concernant comment votre projet atteint au mieux son
objectif. Nous avons besoin de considrer comment exploiter au mieux les fonctionnalits de Python pour crer un code
propre et efficace. En termes pratiques, structurer signifie produire du code propre dont la logique et les dpendances
sont claires ainsi que la faon dont les fichiers et dossiers sont organiss dans le systme de fichiers.
Quelle fonctions doivent aller dans quels modules ? Comment circule la donne dans le projet ? Quelles fonctionnalits
et fonctions peuvent tre groupes ensemble et isoles ? En rpondant des questions comme cela, vous pouvez
commencer planifier, au sens large, ce quoi votre produit fini ressemblera.
Dans cette section, nous allons jeter un il de plus prs sur les systmes de module et dimport de Python comme ils
sont les lments centraux pour faire respecter une structure dans votre projet. Nous discuterons ensuite des diverses
perspectives sur comment construire du code qui peut tre tendu et test de manire fiable.
Structure du dpt
Cest important
Juste comme le style de codage, le design dAPI, et lautomatisation sont essentiels un cycle de dveloppement sain,
la structure dun dpt est une part cruciale de larchitecture de votre projet.
Quand un utilisateur potentiel ou un contributeur arrive sur la page dun dpt, ils voient certaines choses :
Le nom du projet
La description du projet
Un tas de fichiers
Cest seulement quand ils font dfiler la page que les utilisateurs verront le README de votre projet.
Si votre dpt est un amas massif de fichiers ou une pagaille imbrique de rpertoires, ils risquent de regarder ailleurs
avant mme de lire votre belle documentation.
Habillez vous pour le job que vous voulez, pas pour le job que vous avez.
Bien sr, les premires impressions ne sont pas tout. Vous et vos collgues allez passer un nombre dheures incalculable
travailler sur ce dpt, finalement devenir intimement familier avec tous les coins et recoins. Son organisation est
importante.
11
Python Guide Documentation, Version 0.0.1
Dpt exemple
tl ;dr (acronyme de Too Long, I Didnt Read it) : Cest ce que Kenneth Reitz recommande.
Ce dpt est disponible sur GitHub.
README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py
Le module actuel
Si votre module consiste en un seul fichier, vous pouvez le placer directement la racine de votre rpertoire :
./sample.py
Licence
Emplacement ./LICENSE
But Se couvrir juridiquement.
Ceci est sans doute la partie la plus importante de votre dpt, en dehors du code source lui-mme. Les revendications
de copyright et le texte de la licence complet devraient tre dans ce fichier.
Si vous ntes pas sr de la licence que vous souhaitez utiliser pour votre projet, consultez choosealicense.com.
Bien sr, vous tes aussi libre de publier votre code sans une licence, mais cela risque potentiellement dempcher de
nombreuses personnes dutiliser votre code.
Setup.py
Emplacement ./setup.py
But Gestion de la distribution et de la cration de paquets
Si votre paquet de module est la racine de votre dpt, ceci devrait videmment tre aussi la racine.
Fichier requirements
Emplacement ./requirements.txt
But Dpendances de dveloppement.
Un fichier requirements de pip devrait tre plac la racine du dpt. Il devrait spcifier les dpendances requises pour
contribuer au projet : les tests, les builds et la gnration de la documentation.
Si votre projet na pas de dpendances de dveloppement ou vous prfrez la configuration de lenvironnement de
dveloppement via setup.py, ce fichier peut savrer non ncessaire.
Documentation
Emplacement ./docs/
But Documentation de rfrence des paquets.
Il y a trs peu de raison pour cela quil existe ailleurs.
Suite de tests
Une fois que la suite de tests grossit, vous pouvez dplacer vos tests dans un rpertoire, comme ceci :
tests/test_basic.py
tests/test_advanced.py
videmment, ces modules de test doivent importer votre module empaquet pour le tester. Vous pouvez le faire de
plusieurs faons :
Attendre que le paquet soit install dans site-packages.
Utiliser un modification de chemin simple (mais explicite) pour rsoudre le paquet correctement.
Je recommande fortement ce dernier. Demander un dveloppeur de lancer setup.py develop pour tester une base de
code qui change activement lui demande aussi davoir une configuration denvironnement isol pour chaque instance
de la base de code.
Pour donner un contexte dimportation aux tests individuels, crez un fichier tests/config.py.
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
import sample
Ensuite, dans les modules de test individuels, importez le module comme ceci :
Cela fonctionnera toujours comme prvu quelle que soit la mthode dinstallation.
Certains personnes avanceront que vous devriez distribuer vos tests lintrieur du module lui-mme Je ne suis pas
daccord. Cela augmente souvent la complexit pour vos utilisateurs ; de nombreuses suites de test ncessitent souvent
des dpendances et des contextes dexcution supplmentaires.
Makefile
Emplacement ./Makefile
But Tches de gestion gnriques.
Si vous jetez un il la plupart de mes projets ou nimporte quel projet de Pocoo, vous remarquerez un Makefile qui
trane autour. Pourquoi ? Ces projets ne sont pas crits en C... En bref, make est un outil incroyablement utile pour
dfinir des tches gnriques pour votre projet.
Makefile exemple :
init:
pip install -r requirements.txt
test:
py.test tests
Dautres scripts de gestion gnriques (comme manage.py ou fabfile.py) appartiennent aussi la racine du
dpt.
Jai not une nouvelle tendance dans les applications Django depuis la sortie de Django 1.4. De nombreux dvelop-
peurs structurent leurs dpts de manire mdiocre cause des nouveaux modles dapplications mis disposition.
Comment ? Bien, ils vont dans leur nouveau dpt encore nu et frais et excutent ce qui suit, comme ils lont toujours
fait :
Ne faites pas a.
Des chemins rptitifs sont sources de confusion la fois pour vos outils et vos dveloppeurs. Une imbrication inutile
naide personne ( moins dtre nostalgique des dpts SVN monolithiques)
Faisons-le proprement :
Notez le ..
La structure rsultante :
README.rst
manage.py
samplesite/settings.py
samplesite/wsgi.py
samplesite/sampleapp/models.py
Grce la faon dont les imports et les modules sont traits en Python, il est relativement facile de structurer un
projet Python. Facile, ici, signifie que vous navez pas beaucoup de contraintes et que le modle qui fait limport du
module est facile comprendre. Par consquent, vous vous retrouvez avec la tche architecturale pure de concevoir
les diffrentes parties de votre projet et de leurs interactions.
Une structuration facile de projet signifie que cest aussi facile de mal le faire. Certains signes dun projet mal structur
incluent :
Des dpendances circulaires multiples et dsordonnes : si vos classes Table et Chair dans furn.py ont besoin
dimporter Carpenter depuis workers.py pour rpondre une question comme table.isdoneby(),
et si au contraire la classe Carpenter a besoin dimporter Table et Chair, pour rpondre la question
carpenter.whatdo(), alors vous avez une dpendance circulaire. Dans ce cas, vous devrez recourir
des hacks fragiles telles que lutilisation de dclarations dimportation lintrieur de mthodes ou de fonc-
tions.
Couplage cach : chaque changement dans limplmentation de Table casse 20 tests dans des cas de tests non
lis parce quil casse le code de Carpenter, qui ncessite une intervention cible trs prudente pour adapter le
changement. Cela signifie que vous avez trop dhypothses propos de Table dans le code de Carpenter ou
linverse.
Un usage intensif dun tat ou dun contexte global : au lieu de passer explicitement (height, width,
type, wood) de lun lautre, Table et Carpenter sappuient sur des variables globales qui peuvent tre
modifies et sont modifies la vole par diffrents agents. Vous devez examiner tous les accs ces variables
globales pour comprendre pourquoi une table rectangulaire est devenu un carr, et dcouvrir que le code du
modle distant est aussi en train de modifier ce contexte, mettant le dsordre dans les dimensions de la table.
Code Spaghetti : plusieurs pages de clauses if imbrique et de boucles for avec beaucoup de code procdural
copie-coll et aucune segmentation adquate sont connus comme du code spaghetti. Lindentation significative
de Python (une de ses caractristiques les plus controverses) rend trs difficile de maintenir ce genre de code.
Donc, la bonne nouvelle est que vous pourriez ne pas en voir de trop.
Le code Ravioli est plus probable en Python : il se compose de centaines de petits morceaux semblables de
logique, souvent des classes ou des objets, sans structure approprie. Si vous ne pouvez vous rappeler si vous
avez utiliser FurnitureTable, AssetTable ou Table, ou mme TableNew pour votre tche, vous pourriez tre
en train de nager dans du code ravioli.
Modules
Les modules Python sont lune des principales couches dabstraction disponible et probablement la plus naturelle. Les
couches dabstraction permettent la sparation du code dans des parties contenant des donnes et des fonctionnalits
connexes.
Par exemple, une couche dun projet peut grer linterface avec les actions utilisateurs, tandis quun autre grerait la
manipulation de bas-niveau des donnes. La faon la plus naturelle de sparer ces deux couches est de regrouper toutes
les fonctionnalits dinterface dans un seul fichier, et toutes les oprations de bas-niveau dans un autre fichier. Dans
ce cas, le fichier dinterface doit importer le fichier de bas-niveau. Cela se fait avec les dclarations import et from
... import.
Ds que vous utilisez les dclarations import, vous utilisez des modules. Ceux-ci peuvent tre soit des modules intgrs
comme os et sys, soit des modules tiers que vous avez install dans votre environnement, ou dans les modules internes
de votre projet.
Pour rester align avec le guide de style, garder les noms de modules courts, en minuscules, et assurez-vous dviter
dutiliser des symboles spciaux comme le point (.) ou le point dinterrogation ( ?). Donc, un nom de fichier comme
my.spam.py est lun de ceux que vous devriez viter ! Nommer de cette faon interfre avec la manire dont Python
cherche pour les modules.
Dans le cas de my.spam.py, Python attend de trouver un fichier spam.py dans un dossier nomm my, ce qui nest
pas le cas. Il y a un exemple de la comment la notation par point devrait tre utilise dans la documentation Python.
Si vous souhaitez, vous pouvez nommer votre module my_spam.py, mais mme notre ami le underscore (tiret bas)
ne devrait pas tre vu souvent dans les noms de modules.
Mis part quelques restrictions de nommage, rien de spcial nest ncessaire pour quun fichier Python puisse tre un
module, mais vous avez besoin de comprendre le mcanisme dimport afin dutiliser ce concept correctement et viter
certains problmes.
Concrtement, la dclaration import modu va chercher le fichier appropri, qui est modu.py dans le mme rper-
toire que lappelant si il existe. Si il nest pas trouv, linterprteur Python va rechercher modu.py dans le path
rcursivement et lever une exception ImportError si il nest pas trouv.
Une fois que modu.py est trouv, linterprteur Python va excuter le module dans une porte isole. Nimporte
quelle dclaration la racine de modu.py sera excute, incluant les autres imports le cas chant. Les dfinitions de
fonction et classe sont stockes dans le dictionnaire du module.
Ensuite, les variables, les fonctions et les classes du module seront mises disposition de lappelant via lespace de
nom du module, un concept central dans la programmation qui est particulirement utile et puissant en Python.
Dans de nombreuses langages, une directive include file est utilise par le prprocesseur pour prendre tout le
code trouv dans le fichier et le copier dans le code de lappelant. Cest diffrent en Python : le code inclus est isol
dans un espace de nom de module, ce qui signifie que vous navez pas gnralement vous soucier que le code inclus
puisse avoir des effets indsirables, par exemple remplacer une fonction existante avec le mme nom.
Il est possible de simuler le comportement plus standard en utilisant une syntaxe particulire de la dclaration
dimport : from modu import *. Ceci est gnralement considr comme une mauvaise pratique. Lutilisation
dimport * rend le code plus difficile lire et rend les dpendances moins cloisonnes.
Lutilisation de from modu import func est un moyen de cibler la fonction que vous souhaitez importer et
la mettre dans lespace de nom global. Bien que beaucoup moins nfaste que import * parce que cela montre
explicitement ce qui est import dans lespace de nom global, son seul avantage par rapport un import modu,
plus simple est quil permettra dconomiser un peu de frappe clavier.
Trs mauvais
[...]
from modu import *
[...]
x = sqrt(4) # Is sqrt part of modu? A builtin? Defined above?
Mieux
Le mieux
import modu
[...]
x = modu.sqrt(4) # sqrt is visibly part of modu's namespace
Comme mentionn dans la section Style de code, la lisibilit est lune des principales caractristiques de Python.
La lisibilit signifie viter du texte standard inutile et le dsordre, donc des efforts sont consacrs pour essayer de
parvenir un certain niveau de concision. Mais le laconisme et lobscur sont les limites o la brivet doit cesser.
tre en mesure de dire immdiatement do une classe ou une fonction provient, comme dans lidiome modu.func,
amliore grandement la lisibilit du code et la comprhensibilit dans tous les projets mme ceux avec le plus simple
fichier unique.
Paquets
Python fournit un systme de packaging trs simple, qui est simplement une extension du mcanisme de module un
rpertoire.
Tout rpertoire avec un fichier __init__.py est considr comme un paquet Python. Les diffrents modules dans le
paquet sont imports dune manire similaire comme des modules simples, mais avec un comportement spcial pour
le fichier __init__.py, qui est utilis pour rassembler toutes les dfinitions lchelle des paquets.
Un fichier modu.py dans le rpertoire pack/ est import avec la dclaration import pack.modu. Cette dcla-
ration va chercher un fichier __init__.py dans pack, excuter toutes ses dclarations de premier niveau. Puis
elle va chercher un fichier nomm pack/modu.py et excuter tous ses dclarations de premier niveau. Aprs ces
oprations, nimporte quelle variable, fonction ou classe dfinie dans modu.py est disponible dans lespace de nom
pack.modu.
Un problme couramment vu est dajouter trop de code aux fichiers __init__.py. Lorsque la complexit du projet
grossit, il peut y avoir des sous-paquets et sous-sous-paquets dans une structure de rpertoire profonde. Dans ce
cas, importer un seul lment partir dun sous-sous-paquet ncessitera dexcuter tous les fichiers __init__.py
rencontrs en traversant larbre.
Laisser un fichier __init__.py vide est considr comme normal et mme une bonne pratique, si les modules du
paquet et des sous-paquets nont pas besoin de partager aucun code.
Enfin, une syntaxe pratique est disponible pour importer des paquets imbriques profondment : import
very.deep.module as mod. Cela vous permet dutiliser mod la place de la rptition verbeuse de
very.deep.module.
Python est parfois dcrit comme un langage de programmation orient objet. Cela peut tre quelque peu trompeur et
doit tre clarifi.
En Python, tout est un objet, et peut tre manipul en tant que tel. Voil ce que lon entend quand nous disons, par
exemple, que les fonctions sont des objets de premire classe. Les fonctions, les classes, les chanes et mme les types
sont des objets en Python : comme tout objet, ils ont un type, ils peuvent tre passs comme arguments de fonction, et
ils peuvent avoir des mthodes et proprits. Sur ce point, Python est un langage orient objet.
Cependant, contrairement Java, Python nimpose pas la programmation oriente objet comme paradigme de pro-
grammation principal. Il est parfaitement viable pour un projet de Python de ne pas tre orient objet, savoir de ne
pas utiliser ou trs peu de dfinitions de classes, dhritage de classe, ou dautres mcanismes qui sont spcifiques la
programmation oriente objet.
En outre, comme on le voit dans la section modules, la faon dont Python gre les modules et les espaces de nom
donne au dveloppeur un moyen naturel pour assurer lencapsulation et la sparation des couches dabstraction, les
deux tant les raisons les plus courantes dutiliser lorientation objet. Par consquent, les programmeurs Python ont
plus de latitude pour ne pas utiliser lorientation objet, quand elle nest pas requise par le modle mtier.
Il y a quelques raisons pour viter inutilement lorientation objet. Dfinir des classes personnalises est utile lorsque
lon veut coller ensemble un tat et certaines fonctionnalits. Le problme, comme la soulign les discussions sur la
programmation fonctionnelle, vient de la partie state de lquation.
Dans certaines architectures, typiquement des applications Web, plusieurs instances de processus Python sont lances
pour rpondre aux demandes externes qui peuvent se produire en mme temps. Dans ce cas, tenir quelques tats
dans des objets instancis, ce qui signifie garder des informations statiques sur le monde, est sujet des problmes de
concurrence ou de race-conditions. Parfois, entre linitialisation de ltat dun objet (gnralement fait avec la mthode
__init__()) et lutilisation relle de ltat de lobjet travers lune de ses mthodes, le monde peut avoir chang,
et ltat retenu peut ne plus tre jour. Par exemple, une requte peut charger un lment en mmoire et le marquer
comme lu par un utilisateur. Si une autre requte ncessite la suppression de cet article dans le mme temps, il peut
arriver que la suppression se produise pour de vrai aprs que le premier processus ait charg llment, et ensuite nous
devons marquer comme lu un objet supprim.
Ceci et dautres problmes a conduit lide que lutilisation des fonctions sans tat est un meilleur paradigme de
programmation.
Une autre faon de dire la mme chose est de suggrer lutilisation des fonctions et procdures avec le moins de
contextes implicites et deffets de bord possibles. Le contexte dune fonction implicite est compose de nimporte
quelles variables ou objets globaux dans la couche de persistance qui sont accessibles depuis lintrieur de la fonc-
tion. Les effets de bord sont les changements quune fonction fait son contexte implicite. Si une fonction sauve ou
supprime la donne dans une variable globale ou dans la couche de persistance, elle est dite comme ayant un effet de
bord.
Isoler soigneusement les fonctions avec un contexte et des effets de bord depuis des fonctions avec une logique (appel
fonctions pures) permet les avantages suivants :
Les fonctions pures sont dterministes : pour une entre donne fixe, la sortie sera toujours la mme.
Les fonctions pures sont beaucoup plus faciles changer ou remplacer si elles doivent tre refactorises ou
optimises.
Les fonctions pures sont plus faciles tester avec des tests unitaires : il y a moins besoin dune configuration
du contexte complexe et dun nettoyage des donnes aprs.
Les fonctions pures sont plus faciles manipuler, dcorer, et dplacer.
En rsum, les fonctions pures sont des blocs de construction plus efficaces que les classes et les objets pour certaines
architectures parce quelles nont pas de contexte ou deffets de bord.
videmment, lorientation objet est utile et mme ncessaire dans de nombreux cas, par exemple lors du dveloppe-
ment dapplications graphiques de bureau ou des jeux, o les choses qui sont manipuls (fentres, boutons, avatars,
vhicules) ont une vie relativement longue par elle-mme dans la mmoire de lordinateur.
Dcorateurs
Le langage Python fournit une syntaxe simple mais puissante appele dcorateurs. Un dcorateur est une fonction
ou une classe qui enveloppe (ou dcore) une fonction ou une mthode. La fonction ou mthode dcore remplacera
la fonction ou mthode originale non dcore . Parce que les fonctions sont des objets de premire classe en Python,
cela peut tre fait manuellement, mais utiliser la syntaxe @decorator est plus clair et donc prfr.
def foo():
# do something
def decorator(func):
# manipulate func
return func
@decorator
def bar():
# Do something
# bar() is decorated
Ce mcanisme est utile pour la Separation of concerns et vite une logique externe non lie de polluer la logique
de base de la fonction ou de la mthode. Un bon exemple de morceau de fonctionnalit qui est mieux gr avec la
dcoration est la mmorisation ou la mise en cache : vous voulez stocker les rsultats dune fonction coteuse dans
une table et les utiliser directement au lieu de les recalculer quand ils ont dj t calculs. Ceci ne fait clairement pas
partie de la logique de la fonction.
Gestionnaires de contexte
Un gestionnaire de contexte est un objet Python qui fournit une information contextuelle supplmentaire une action.
Cette information supplmentaire prend la forme de lexcution dun callable lors de linitialisation dun contexte
laide de la dclaration with, ainsi que lexcution dun callable aprs avoir termin tout le code lintrieur du bloc
with. Lexemple le plus connu dutilisation dun gestionnaire de contexte est montr ici, louverture dun fichier :
with open('file.txt') as f:
contents = f.read()
Quiconque est familier avec ce pattern sait que linvocation open de cette faon sassure que la fonction closede
f sera appele un moment donn. Cela rduit la charge cognitive dun dveloppeur et rend le code plus facile
lire.
Il existe deux moyens faciles dimplmenter cette fonctionnalit vous-mme : en utilisant une classe ou laide dun
gnrateur. Implmentons la fonctionnalit ci-dessus nous-mmes, en commenant par lapproche par classe :
class CustomOpen(object):
def __init__(self, filename):
self.file = open(filename)
def __enter__(self):
return self.file
with CustomOpen('file') as f:
contents = f.read()
Cest juste un objet Python rgulier avec deux mthodes supplmentaires qui sont utiliss par la dclaration with.
CustomOpen est dabord instanci puis sa mthode __enter__ est appele et tout ce que __enter__ retourne est
assign f dans la partie as _f de la dclaration. Lorsque le contenu du bloc with a fini de sexcuter, la mthode
__exit__ est alors appele.
Et maintenant, lapproche par gnrateur en utilisant la bibliothque contextlib de Python :
@contextmanager
def custom_open(filename):
f = open(filename)
try:
yield f
finally:
f.close()
with custom_open('file') as f:
contents = f.read()
Cela fonctionne exactement de la mme manire que lexemple de classe ci-dessus, mais il est plus laconique. La
fonction custom_open sexcute jusqu la dclaration yield. Il rend alors le contrle la dclaration with, qui
assigne tout ce qui tait yield fdans la portion as f. La clause finally sassure que close() est appel sil
y avait ou non une exception lintrieur du with.
tant donn que les deux approches semblent similaires, nous devrions suivre le Zen de Python pour dcider quand
utiliser laquelle. Lapproche classe pourrait tre mieux sil y a une quantit considrable de logique encapsuler.
Lapproche fonction pourrait tre prfrable pour des situations o nous avons affaire une action simple.
Typage dynamique
Python est typ dynamiquement, ce qui signifie que les variables nont pas un type fixe. En fait, en Python, les va-
riables sont trs diffrentes de ce quelles sont dans de nombreux autres langages, en particulier les langages typs
statiquement. Les variables ne sont pas un segment de la mmoire de lordinateur o une certaine valeur est crite,
elles sont des tags ou des noms pointant vers des objets. Il est donc possible pour la variable a dtre dfinie la
valeur 1, puis la valeur a string, puis une fonction.
Le typage dynamique de Python est souvent considr comme une faiblesse, et en effet, elle peut conduire la com-
plexit et du code difficile dbugguer. Quelque chose nomme a peut tre assign de nombreuses choses
diffrentes, et le dveloppeur ou le mainteneur doit suivre ce nom dans le code pour sassurer quil na pas t assign
un objet compltement diffrent.
Quelques lignes directrices pour viter ce problme :
vitez dutiliser le mme nom de variable pour des choses diffrentes.
Mauvais
a = 1
a = 'a string'
def a():
pass # Do something
Bon
count = 1
msg = 'a string'
def func():
pass # Do something
Utiliser des fonctions ou des mthodes courtes permet de rduire le risque dutiliser le mme nom pour deux choses
indpendantes.
Il est prfrable dutiliser des noms diffrents, mme pour des choses qui sont lies, quand elles ont un type diffrent :
Mauvais
items = 'a b c d' # This is a string...
items = items.split(' ') # ...becoming a list
items = set(items) # ...and then a set
Il ny a pas de gain defficacit lors de la rutilisation de noms : les affectations devront crer de nouveaux objets de
toute faon. Toutefois, lorsque la complexit augmente et chaque affectation est spare par dautres lignes de code,
incluant des branches si et des boucles, il devient plus difficile dtablir quel est le type dune variable donne.
Certaines pratiques de codage, comme la programmation fonctionnelle, recommandent de ne jamais raffecter une
variable. En Java cela se fait avec le mot-cl final. Python na pas de mot-cl final et cela irait lencontre de sa
philosophie de toute faon. Cependant, cela peut tre une bonne discipline pour viter dassigner une variable plus
dune fois, et cela aide comprendre le concept de types mutables et immutables.
Les types immuables fournissent aucune mthode pour modifier leur contenu. Par exemple, la variable x dfinie
lentier 6 na pas de mthode increment. Si vous voulez calculer x + 1, vous devez crer un autre entier et lui donner
un nom.
my_list = [1, 2, 3]
my_list[0] = 4
print my_list # [4, 2, 3] <- The same list as changed
x = 6
x = x + 1 # The new x is another object
Une consquence de cette diffrence de comportement est que les types mutables ne sont pas stables, et ne peuvent
donc tre utilises comme cls du dictionnaire.
Lutilisation correcte des types mutables pour des choses qui sont mutables par nature et des types immutables pour
des choses qui sont fixes par nature aide clarifier lintention du code.
Par exemple, lquivalent immutable dune liste est le tuple, cr avec (1, 2). Ce tuple est une paire qui ne peut pas
tre chang sur place, et qui peut tre utilise comme cl pour un dictionnaire.
Une particularit de Python qui peut surprendre les dbutants est que les chanes sont immutables. Cela signifie que
lors de la construction dune chane partir de ses parties, il est beaucoup plus efficace daccumuler les parties dans
une liste, qui est mutable, puis coller (join) les morceaux ensemble lorsque la chane complte est ncessaire. Une
chose remarquer, cependant, est que les comprhensions de liste sont mieux et plus rapides que la construction dune
liste dans une boucle avec des appels append().
Mauvais
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = ""
for n in range(20):
nums += str(n) # slow and inefficient
print nums
Bon
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = []
for n in range(20):
nums.append(str(n))
print "".join(nums) # much more efficient
Le mieux
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = [str(n) for n in range(20)]
print "".join(nums)
Une dernire chose mentionner sur les chanes est que lutilisation join() nest est pas toujours ce quil y a de
mieux. Dans les cas o vous crez une nouvelle chane depuis un nombre prdtermin de chanes, utiliser loprateur
daddition est vraiment plus rapide, mais dans des cas comme ci-dessus ou dans des cas o vous ajoutez une chane
existante, utiliser join() devrait tre votre mthode de prfrence.
foo = 'foo'
bar = 'bar'
Note : Vous pouvez galement utiliser loprateur de formatage % pour concatner un nombre prdtermin de
chanes en plus de str.join() et +. Cependant, la PEP 3101, dcourage lutilisation de loprateur % en faveur de
la mthode str.format().
foo = 'foo'
bar = 'bar'
Runners
Lectures complmentaires
http://docs.python.org/2/library/
http://www.diveintopython.net/toc/index.html
Style de code
Si vous demandez aux programmeurs Python ce quils aiment le plus propos de Python, ils citeront souvent sa grande
lisibilit. En effet, un haut niveau de lisibilit est au cur de la conception du langage Python, aprs le fait reconnu
que le code est lu beaucoup plus souvent que ce qui est crit.
Une raison de la haute lisibilit du code Python est son jeu relativement complet dinstructions de style de code et ses
idiomes Pythoniques.
Quand un dveloppeur Python vtran (un Pythoniste) appelle des portions de code non Pythoniques, il veut dire
gnralement que ces lignes de code ne suivent pas les instructions communes et ne parviennent pas exprimer leur
intention dans ce qui est considr comme la meilleure faon (entendez : la manire la plus lisible).
Dans certains cas limites, aucune meilleure pratique na t convenue sur la faon dexprimer une intention en code
Python, mais ces cas sont rares.
Concepts gnraux
Code explicite
Alors que toute sorte de magie noire est possible avec Python, la manire la plus explicite et directe est prfrable.
Mauvais
def make_complex(*args):
x, y = args
return dict(**locals())
Bon
Dans le bon code ci-dessus, x et y sont explicitement reus de lappelant, et un dictionnaire explicite est retourn. Le
dveloppeur utilisant cette fonction sait exactement ce quil faut faire en lisant la premire et la dernire ligne, ce qui
nest pas le cas avec le mauvais exemple.
Bien que certaines dclarations composes comme les comprhensions de liste soient autorises et apprcies pour
leur brivet et leur expressivit, cest une mauvaise pratique davoir deux dclarations disjointes sur la mme ligne
de code.
Mauvais
if x == 1: print 'one'
Bon
print 'one'
print 'two'
if x == 1:
print 'one'
Arguments de fonction
Les arguments peuvent tre passs aux fonctions de quatre manires diffrentes.
1. Les arguments positionnels sont obligatoires et nont pas de valeurs par dfaut. Ils sont la forme la plus simple
des arguments et ils peuvent tre utiliss pour les quelques arguments de fonction qui sont partie intgrante de la
signification de la fonction et leur ordre est naturel. Par exemple, dans send(message, recipient) ou
point(x, y) lutilisateur de la fonction na pas de difficult se souvenir que ces deux fonctions ncessitent
deux arguments, et dans quel ordre.
Dans ces deux cas, il est possible dutiliser des noms dargument lors de lappel des fonctions et, ce fai-
sant, il est possible de changer lordre des arguments, appelant par exemple send(recipient=World,
message=Hello) et point(y=2, x=1), mais cela rduit la lisibilit et est inutilement verbeux, par rapport
aux appels plus simples send(Hello, World) et point(1, 2).
2. Les arguments nomms ne sont pas obligatoires et ont des valeurs par dfaut. Ils sont souvent utiliss pour
les paramtres facultatifs envoys la fonction. Quand une fonction a plus de deux ou trois paramtres posi-
tionnels, sa signature est plus difficile retenir et lutilisation darguments nomms avec des valeurs par dfaut
est utile. Par exemple, une fonction send plus complte pourrait tre dfinie comme send(message, to,
cc=None, bcc=None). Ici cc et bcc sont facultatifs, et sont valus None quand ils ne reoivent pas
une autre valeur.
Lappel dune fonction avec des arguments nomms peut tre fait de plusieurs faons en Python. Par exemple, il
est possible de suivre lordre des arguments dans la dfinition sans nommer explicitement les arguments, comme dans
send(Hello, World, Cthulhu, God), envoyant une copie carbone invisible God. Il serait ga-
lement possible de nommer des arguments dans un autre ordre, comme dans send(Hello again, World,
bcc=God, cc=Cthulhu). Ces deux possibilits sont mieux vites sans aucune vraie raison de ne pas suivre
la syntaxe qui est le plus proche de la dfinition de la fonction : send(Hello, World, cc=Cthulhu,
bcc=God).
Comme note garder de ct, en suivant le principe YAGNI, il est souvent plus difficile denlever un argument
optionnel (et sa logique dans la fonction) qui a t ajout juste au cas o et nest apparemment jamais utilis, que
dajouter un nouvel argument optionnel et sa logique en cas de besoin.
3. La liste darguments arbitraires est la troisime faon de passer des arguments une fonction. Si lintention
de la fonction est mieux exprime par une signature avec un nombre extensible darguments positionnels,
elle peut tre dfinie avec les constructions args. Dans le corps de la fonction, args sera un tuple de tous
les arguments positionnels restants. Par exemple, send(message, *args) peut tre appel avec chaque
destinataire comme argument : send(Hello, God, Mom, Cthulhu), et dans le corps de la
fonction args sera gal (God, Mom, Cthulhu).
Cependant, cette construction prsente des inconvnients et doit tre utilise avec prudence. Si une fonction reoit
une liste darguments de mme nature, il est souvent plus clair de la dfinir comme une fonction dun seul argument,
cet argument tant une liste ou nimporte quelle squence. Ici, si send a plusieurs destinataires, il est prfrable de
la dfinir explicitement : send(message, recipients) et de lappeler avec send(Hello, [God,
Mom, Cthulhu]). De cette faon, lutilisateur de la fonction peut manipuler la liste des destinataires sous
forme de liste lavance, et cela ouvre la possibilit de passer un ordre quelconque, y compris les itrateurs, qui ne
peuvent tre unpacked comme dautres squences.
4. Le dictionnaire darguments mot-cl arbitraire est le dernier moyen de passer des arguments aux fonctions.
Si la fonction ncessite une srie indtermine darguments nomms, il est possible dutiliser la construction
**kwargs. Dans le corps de la fonction, kwargs sera un dictionnaire de tous les arguments nomms passs
qui nont pas t rcuprs par dautres arguments mot-cls dans la signature de la fonction.
La mme prudence que dans le cas de liste darguments arbitraires est ncessaire, pour des raisons similaires : ces
techniques puissantes doivent tre utiliss quand il y a une ncessit avre de les utiliser, et elles ne devraient pas tre
utilises si la construction simple et plus claire est suffisante pour exprimer lintention de la fonction.
Il appartient au programmeur dcrire la fonction pour dterminer quels arguments sont des arguments positionnels
et qui sont des arguments optionnels mots-cls, et de dcider dutiliser ou non les techniques avances de passage
darguments arbitraires. Si le conseil ci-dessus est suivi bon escient, il est possible et agrable dcrire des fonctions
Python qui sont :
faciles lire (le nom et les arguments nont pas besoin dexplications)
faciles changer (lajout dun nouveau mot-cl en argument ne casse pas les autres parties du code)
Un outil puissant pour les hackers, Python vient avec un jeu trs riche de hooks et doutils vous permettant de faire
presque tout sorte de trucs dlicats. Par exemple, il est possible de faire chacun des lments suivants :
changer comment les objets sont crs et instancis
changer comment linterprteur Python importe les modules
il est mme possible (et recommand si ncessaire) pour intgrer des routines C dans Python.
Cependant, toutes ces options prsentent de nombreux inconvnients et il est toujours prfrable dutiliser le moyen
le plus simple pour atteindre votre objectif. Le principal inconvnient est que la lisibilit souffre beaucoup lors de
lutilisation de ces constructions. De nombreux outils danalyse de code, comme pylint ou pyflakes, ne pourront pas
analyser ce code magique.
Nous considrons quun dveloppeur Python devrait connatre ces possibilits presque infinies, car cela inspire la
confiance quaucun problme infranchissable ne sera sur le chemin. Cependant, savoir comment et surtout quand ne
pas les utiliser est trs important.
Comme un matre de kung-fu, un Pythoniste sait comment tuer avec un seul doigt, et ne jamais le faire pour de vrai.
Comme on le voit ci-dessus, Python permet de nombreuses astuces, et certains dentre elles sont potentiellement
dangereuses. Un bon exemple est que tout code client peut surcharger les proprits et les mthodes dun objet : il
ny a pas mot-cl private en Python. Cette philosophie, trs diffrente des langages trs dfensifs comme Java, qui
donnent beaucoup de mcanismes pour empcher toute utilisation abusive, est exprime par le dicton : Nous sommes
tous les utilisateurs responsables.
Cela ne veut pas dire que, par exemple, que des proprits ne sont pas considres comme prives, et quaucune
encapsulation approprie nest possible en Python. Au contraire, au lieu de compter sur les murs de bton rigs par
les dveloppeurs entre leur code et les autres, la communaut Python prfre compter sur un ensemble de conventions
indiquant que ces lments ne doivent pas tre directement accessibles.
La convention principale pour les proprits prives et les dtails dimplmentation est de prfixer toutes les carac-
tristiques internes avec un tiret bas. Si le code client enfreint cette rgle et accde ces lments marqus, tous les
mauvais comportements ou problmes rencontrs si le code est modifi est de la responsabilit du code client.
Lutilisation de cette convention gnreusement est encourage : toute mthode ou une proprit qui ne sont pas
destines tre utilises par le code client doivent tre prfixes avec un tiret bas. Cela permettra de garantir une
meilleure sparation des tches et une modification plus facile du code existant ; il sera toujours possible dexposer
une proprit prive, mais rendre une proprit publique prive pourrait tre une opration beaucoup plus difficile.
Valeurs retournes
Quand une fonction crot en complexit, il nest pas rare dutiliser des instructions de retour multiples lintrieur du
corps de la fonction. Cependant, afin de maintenir une intention claire et un niveau de lisibilit durable, il est prfrable
dviter de retourner des valeurs significatives partir de nombreux points de sortie dans le corps.
Il existe deux principaux cas pour retourner des valeurs dans une fonction : le rsultat du retour de la fonction quand
il a t trait normalement, et les cas derreur indiquant un paramtre dentre erron ou toute autre raison pour la
fonction de ne pas tre capable de complter son calcul ou sa tche.
Si vous ne souhaitez pas de lever des exceptions pour le second cas, puis retourner une valeur, comme None ou False,
indiquer que la fonction pourrait ne pas fonctionner correctement pourrait tre ncessaire. Dans ce cas, il est prfrable
de la retourner aussitt que le contexte incorrect a t dtect. Cela aidera aplatir la structure de la fonction : tout le
code aprs linstruction retour-parce-que-erreur peut assumer que la condition est remplie pour continuer calculer le
rsultat principal de la fonction. Avoir de telles multiples dclarations de retour est souvent ncessaire.
Cependant, lorsquune fonction a plusieurs principaux points de sortie pour son fonctionnement normal, il devient
difficile de dbugguer le rsultat retourn, donc il peut tre prfrable de garder un seul point de sortie. Cela permettra
galement daider refactoriser quelques chemins dans le code, et les points de sortie multiples sont une indication
probable quun tel refactoring est ncessaire.
def complex_function(a, b, c):
if not a:
return None # Raising an exception might be better
if not b:
return None # Raising an exception might be better
# Some complex code trying to compute x from a, b and c
# Resist temptation to return x if succeeded
if not x:
# Some Plan-B computation of x
return x # One single exit point for the returned value x will help
# when maintaining the code.
Idiomes
Un idiome de langage, dit simplement, est un moyen dcrire du code. La notion didiomes de programmation est
discute amplement sur c2 et sur Stack Overflow.
Du code Python idiomatique est souvent dsign comme tant Pythonique.
Bien quil y ait habituellement une et de prfrence une seule manire vidente de le faire ; la faon dcrire
du code Python idiomatique peut tre non vidente pour les dbutants Python. Donc, les bons idiomes doivent tre
consciemment acquis.
Certains idiomes Python communs suivent :
Unpacking
Si vous connaissez la longueur dune liste ou dun tuple, vous pouvez attribuer des noms ses lments avec lunpa-
cking. Par exemple, tant donn que enumerate() fournira un tuple de deux lments pour chaque lment dans la
liste :
En Python 3, une nouvelle mthode dunpacking tendue a t introduite par la PEP 3132 :
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
Si vous avez besoin dassigner quelque chose (par exemple, dans Unpacking) mais que vous navez pas besoin de cette
variable, utilisez __ :
filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
Note : Beaucoup de guides de style Python recommandent lutilisation dun seul tiret bas _ pour les variables
jetables plutt que les tirets bas doubles __ recommands ici. Le problme est que _ est couramment utilis
comme un alias pour la fonction gettext(), et est galement utilis dans linvite interactive pour garder la valeur
de la dernire opration. Lutilisation dun tiret bas double est la place est tout aussi clair et presque aussi pratique,
et limine le risque dinterfrer accidentellement avec lun de ces autres cas dutilisation.
parce que les listes sont mutables, loprateur * (comme ci-dessus) crera une liste de N rfrences vers la mme liste,
ce qui est probablement pas ce que vous voulez. A la place, utilisez une comprhension de liste :
Un idiome commun pour la cration de chanes est dutiliser str.join() sur une chane vide.
letters = ['s', 'p', 'a', 'm']
word = ''.join(letters)
Cela va dfinir la valeur de la variable word spam. Cet idiome peut tre appliqu des listes et des tuples.
Parfois, nous devons chercher travers une collection de choses. Regardons deux options : lists et sets.
Prenez le code suivant pour exemple :
s = set(['s', 'p', 'a', 'm'])
l = ['s', 'p', 'a', 'm']
def lookup_set(s):
return 's' in s
def lookup_list(l):
return 's' in l
Mme si les deux fonctions semblent identiques, parce que lookup_set utilise le fait que les sets en Python sont des
tables de hashage, les performances de recherche entre les deux sont trs diffrentes. Pour dterminer si un lment se
trouve dans une liste, Python devra parcourir chaque lment jusqu ce quil trouve un lment correspondant. Cela
prend du temps, surtout pour de longues listes. Dans un set, dautre part, le hachage de llment dira Python o
dans le set chercher un lment correspondant. En consquence, la recherche peut tre faite rapidement, mme si le set
est grand. La recherche dans les dictionnaires fonctionne de la mme faon. Pour plus dinformations, voir cette page
StackOverflow. Pour plus dinformations sur la quantit de temps ncessaire pour les diffrentes oprations courantes
pour chacune de ces structures de donnes, voir cette page.
En raison de ces diffrences de performance, cest souvent une bonne ide dutiliser des sets ou des dictionnaires au
lieu de listes dans les cas o :
La collection contiendra un grand nombre dlments
Vous rechercherez de manire rptitive les lments dans la collection
Vous navez pas pas dlments dupliqus.
Pour les petites collections, ou les collections que vous navez pas frquemment rechercher, le temps additionnel
et la mmoire requise pour configurer la table de hashage seront souvent plus longs que le temps gagn grce
lamlioration de la vitesse de recherche.
Le Zen de Python
Aussi connu comme PEP 20, les principes directeurs pour la conception de Python.
Pour quelques exemples de bons styles Python, voir ces diapositives dun groupe dutilisateurs Python.
PEP 8
PEP 8 est le guide de fait du style de code pour Python. Une version de haute qualit, facile lire de la PEP 8 est
galement disponible sur pep8.org.
Cest une lecture fortement recommande. La communaut Python entire fait de son mieux pour adhrer aux instruc-
tions nonces dans le prsent document. Certains projets peuvent osciller autour delles de temps autre, tandis que
dautres peuvent modifier ses recommandations.
Cela tant dit, conformer votre code Python PEP 8 est gnralement une bonne ide et contribue rendre le code
plus consistant lorsque vous travaillez sur des projets avec dautres dveloppeurs. Il existe un programme en ligne de
commande, pep8, qui peut vrifier la conformit de votre code. Installez-le en excutant la commande suivante dans
votre terminal :
Ensuite, excutez-le sur un fichier ou une srie de fichiers pour avoir un rapport de toutes violations.
$ pep8 optparse.py
optparse.py:69:11: E401 multiple imports on one line
optparse.py:77:1: E302 expected 2 blank lines, found 1
optparse.py:88:5: E301 expected 1 blank line, found 0
optparse.py:222:34: W602 deprecated form of raising exception
Le programme autopep8 peut tre utilis pour reformater automatiquement le code dans le style PEP 8. Installez le
programme avec :
Exclure loption --in-place va mener le programme renvoyer en sortie le code modifi directement dans la
console pour examen. Loption --aggressive effectuera des changements plus importants et peut tre applique
plusieurs reprises pour plus deffet.
Conventions
Voici quelques conventions que vous devriez suivre pour rendre votre code plus facile lire.
Vous navez pas besoin de comparer explicitement une valeur True ou None, ou 0 - vous pouvez simplement lajouter
linstruction if. Voir le Test des valeurs True pour une liste de ce qui est considr comme False.
Mauvais :
if attr == True:
print 'True!'
if attr == None:
print 'attr is None!'
Bon :
# Just check the value
if attr:
print 'attr is truthy!'
d = {'hello': 'world'}
if d.has_key('hello'):
print d['hello'] # prints 'world'
else:
print 'default_value'
Bon :
d = {'hello': 'world'}
# Or:
if 'hello' in d:
print d['hello']
Les listes en comprhensions fournissent un manire puissante et concise de travailler avec les listes. En outre, les
fonctions map() et filter() peuvent effectuer des oprations sur des listes en utilisant une syntaxe diffrente et
plus concise.
Mauvais :
# Filter elements greater than 4
a = [3, 4, 5]
b = []
for i in a:
if i > 4:
b.append(i)
Bon :
a = [3, 4, 5]
b = [i for i in a if i > 4]
# Or:
b = filter(lambda x: x > 4, a)
Mauvais :
# Add three to all list members.
a = [3, 4, 5]
for i in range(len(a)):
a[i] += 3
Bon :
a = [3, 4, 5]
a = [i + 3 for i in a]
# Or:
a = map(lambda i: i + 3, a)
a = [3, 4, 5]
for i, item in enumerate(a):
print i, item
# prints
# 0 3
# 1 4
# 2 5
La fonction enumerate() a une meilleure lisibilit que la gestion dun compteur manuellement. De plus, elle est
plus optimiss pour les itrateurs.
Utilisez la syntaxe with open pour lire depuis des fichiers. Cela fermera automatiquement les fichiers pour vous.
Mauvais :
f = open('file.txt')
a = f.read()
print a
f.close()
Bon :
with open('file.txt') as f:
for line in f:
print line
La dclaration with est meilleure parce quelle assure que vous fermez toujours le fichier, mme si une exception est
leve lintrieur du block with.
Continuations de ligne
Quand une ligne logique de code est plus longue que la limite accepte, vous devez la diviser sur plusieurs lignes
physiques. Linterprteur Python rejoindra lignes conscutives si le dernier caractre de la ligne est une barre oblique
inverse. Ceci est utile dans certains cas, mais doit gnralement tre vite en raison de sa fragilit : un espace blanc
ajout la fin de la ligne, aprs la barre oblique inverse, va casser le code et peut avoir des rsultats inattendus.
Une meilleure solution est dutiliser des parenthses autour de vos lments. Avec une parenthse non ferme laisse
la fin dune ligne, linterprteur Python joindra la ligne suivante jusqu ce que les parenthses soient fermes. Le
mme comportement est valable pour des accolades et des crochets.
Mauvais :
my_very_big_string = """For a long time I used to go to bed early. Sometimes, \
when I had put out my candle, my eyes would close so quickly that I had not even \
time to say Im going to sleep."""
Bon :
my_very_big_string = (
"For a long time I used to go to bed early. Sometimes, "
"when I had put out my candle, my eyes would close so quickly "
"that I had not even time to say Im going to sleep."
Cependant, le plus souvent, avoir couper une longue ligne logique est un signe que vous essayez de faire trop de
choses en mme temps, ce qui peut gner la lisibilit.
Lun des principaux principes derrire la conception de Python est la cration dun code lisible. La motivation derrire
cette conception est simple : La premire chose que les programmeurs Python font est de lire le code.
Lun des secrets pour devenir un grand programmeur Python est de lire, de comprendre et dapprhender un excellent
code.
Une excellent code suit gnralement les lignes directrices nonces dans Style de code, et fait de son mieux pour
exprimer une intention claire et concise au lecteur.
Ce qui est inclus ci-dessous est une liste de projets Python recommands pour lecture. Chacun de ces projets est un
parangon de codage Python.
Howdoi Howdoi est un outil de recherche de code, crit en Python.
Flask Flask est un microframework pour Python bas sur Werkzeug et Jinja2. Il est destin pour bien dmarrer
trs rapidement et a t dvelopp avec les meilleures intentions lesprit.
Diamond Diamond est un daemon python qui recueille les mtriques et les publie vers Graphite ou dautres
backends. Il est capable de collecter les mtriques du cpu, de la mmoire, du rseau, des i/o, de la charge et
des disques. En outre, il dispose dune API pour implmenter des collecteurs personnaliss pour la collecte des
mtriques partir de presque toutes les sources.
Werkzeug Werkzeug a commenc comme simple collection de divers utilitaires pour les applications WSGI et
est devenu lun des modules utilitaire WSGI les plus avances. Il comprend un dbogueur puissant, la gestion
des objets request et response complet, des utilitaires HTTP pour grer les tags dentit, les en-ttes de contrle
de cache, les dates HTTP, la gestion des cookies, le tlchargement de fichiers, un systme puissant de routage
URL et un tas de modules addons contribus par la communaut.
Requests Requests est une bibliothque HTTP sous licence Apache 2, crite en Python, pour les tres humains.
Tablib Tablib est une bibliothque pour la gestion de jeux de donnes tabulaires, agnostique en terme de format,
crite en Python.
faire
Inclure des exemples de code de code exemplaire de chacun des projets numrs. Expliquer pourquoi cest un ex-
cellent code. Utilisez des exemples complexes.
faire
Expliquer les techniques pour identifier rapidement les structures de donnes, les algorithmes et dterminer ce que le
code fait.
Documentation
La lisibilit est une priorit pour les dveloppeurs Python, la fois dans la documentation du projet et du code. Suivre
quelques bonnes pratiques simples peut vous sauver, vous et dautres, beaucoup de temps.
Documentation de projet
Un fichier README la racine du rpertoire devrait donner des informations gnrales la fois pour les utilisateurs
et les mainteneurs dun projet. Il devrait tre du texte brut ou crit dans avec un markup trs facile lire, par exemple
reStructuredText ou Markdown. Il devrait contenir quelques lignes expliquant le but du projet ou de la bibliothque
(sans supposer que lutilisateur ne sait rien sur le projet), lURL de la source principale du logiciel, ainsi que des
informations de crdit basiques. Ce fichier est le principal point pour les lecteurs du code.
Un fichier INSTALL est moins ncessaire avec Python. Les instructions dinstallation sont souvent rduites une
commande, comme pip install module ou python setup.py install et ajoute au fichier README.
Un fichier LICENSE devrait toujours tre prsent et prciser la licence sous laquelle le logiciel est mis la disposition
du public.
Un fichier TODO file ou une section TODO dans le README devrait lister le dveloppement prvu pour le code.
Un fichier CHANGELOG ou une section dans dans le README doit compiler un bref aperu des changements dans la
base de code pour les versions les plus rcentes.
Publication de projet
Selon le projet, la documentation peut inclure tout ou partie des composants suivants :
Une introduction devrait montrer une trs bref aperu de ce qui peut tre fait avec le produit, en utilisant un ou
deux cas dutilisation extrmement simplifis. Cest le pitch de 30 seconds de votre projet.
Un tutoriel devrait montrer certains cas dutilisation de base plus en dtail. Le lecteur suivra une procdure pas
pas pour configurer un prototype fonctionnel.
Une rfrence dAPI est gnralement gnre partir du code (voir docstrings). Elle liste toutes les interfaces,
les paramtres et les valeurs de retour publiques.
La documentation dveloppeur est destine aux contributeurs potentiels. Cela peut inclure les conventions de
code et la stratgie de conception gnrale du projet.
Sphinx
Sphinx est de loin loutil le plus populaire de la documentation Python. Utilisez-le Il convertit le langage de markup
reStructuredText dans une gamme de formats de sortie incluant HTML, LaTeX (pour les versions imprimables PDF),
les pages de manuel et le texte brut.
Il y a aussi un hbergement gnial et gratuit pour votre documentation Sphinx : Read The Docs. Utilisez-le. Vous pou-
vez le configurer avec des hooks de commit lis votre dpt source. Ainsi, la re-gnration de votre documentation
se fera automatiquement.
Note : Sphinx est clbre pour sa production dAPI, mais il fonctionne aussi bien pour la documentation gnrale de
projet. Ce guide est construit avec Sphinx et est hberg sur Read The Docs
reStructuredText
La plupart de la documentation Python est crite avec reStructuredText. Cest comme le Markdown avec toutes les
extensions optionnelles intgres.
Le reStructuredText Primer et le reStructuredText Quick Reference devraient vous aider vous familiariser avec sa
syntaxe.
2.4. Documentation 33
Python Guide Documentation, Version 0.0.1
Les commentaires clarifient le code et ils sont ajouts dans le but de rendre le code plus facile comprendre. En
Python, les commentaires commencent par un dise (signe dise)(#). En Python, les docstrings dcrivent les modules,
les classes et les fonctions :
def square_and_rooter(x):
"""Returns the square root of self times self."""
...
En gnral, suivez la section des commentaires de la PEP 8#comments (le guide de style Python). Plus dinforma-
tions sur les docstrings peuvent tre trouves sur la PEP 0257#specification (Le guide convention Docstring).
Nutilisez pas des chanes avec triple-guillemets pour commenter le code. Ce nest pas une bonne pratique, parce
que les outils orients lignes en ligne de commande tels que grep ne seront pas conscients que le code comment
est inactif. Il est prfrable dajouter des dises au niveau dindentation correct pour chaque ligne commente. Votre
diteur a probablement la capacit faire cela facilement, et cela vaut la peine dapprendre le bouton pour commen-
ter/dcommenter.
Docstrings et la magie
Certains outils utilisent docstrings pour intgrer un comportement tant plus que de la documentation, tels que la
logique de test unitaire. Ceux-ci peuvent tre bien, mais vous ne vous tromperez jamais avec voici ce que cela fait.
Ceux-ci ne sont pas interchangeables. Pour une fonction ou une classe, le premier bloc de commentaire est une note
dun programmeur. Le docstring dcrit le fonctionnement de la fonction ou de la classe :
# This function slows down program execution for some reason.
def square_and_rooter(x):
"""Returns the square root of self times self."""
...
Autres outils
Ronn Ronn gnre les manuels Unix. Il convertit des fichiers texte lisibles par lhomme en roff pour affichage
dans le terminal, et galement en format HTML pour le web.
MkDocs MkDocs est un gnrateur de site statique simple et rapide qui est oriente vers la construction de la
documentation de projet avec Markdown.
Les basiques
Unittest
unittest est le module de test tout en un dans la bibliothque standard Python. Son API sera familire qui-
conque a dj utilis une des sries doutils JUnit/nUnit/CppUnit.
Crer des cas de test est ralis en faisant des sous-classes de unittest.TestCase.
import unittest
def fun(x):
return x + 1
class MyTest(unittest.TestCase):
def test(self):
self.assertEqual(fun(3), 4)
A partir de Python 2.7, unittest comprend galement ses propres mcanismes de dcouverte de tests.
unittest dans la documentation de la bibliothque standard
Doctest
Le module doctest recherche des morceaux de texte qui ressemblent des sessions de Python interactifs en docs-
trings, puis excute ces sessions pour vrifier quils fonctionnent exactement comme indiqu.
Les doctests ont un cas dutilisation diffrent des tests unitaires appropris : ils sont gnralement moins dtaills
et ne capturent pas des cas particuliers ou des bugs de rgression obscurs. Ils sont utiles en tant que documentation
expressive des principaux cas dutilisation dun module et de ses composants. Cependant, les doctests doivent excuter
automatiquement chaque fois que la suite de tests complte sexcute.
Un simple doctest dans une fonction :
def square(x):
"""Return the square of x.
>>> square(2)
4
>>> square(-2)
4
"""
return x * x
if __name__ == '__main__':
import doctest
doctest.testmod()
Lors de lexcution de ce module partir de la ligne de commande comme dans python module.py, les doctests
vont sexcuter et se plaindre si rien ne se comporte comme dcrit dans les docstrings.
Outils
py.test
py.test est une alternative sans boilerplate au module unittest standard Python.
En dpit dtre un outil de test plein de fonctionnalits et extensible, il bnficie dune syntaxe simple. Crer une suite
de tests est aussi facile qucrire un module avec un couple de fonctions :
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
test_sample.py F
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.02 seconds =========================
est beaucoup moins de travail que ce qui serait ncessaire pour la fonctionnalit quivalente avec le module unittest !
py.test
Nose
nose fournit la dcouverte automatique de tests pour vous pargner les tracas de crer manuellement des suites de
tests. Il fournit galement de nombreux plugins pour des fonctionnalits telles que la sortie de test compatible xUnit,
les rapports sur la couverture et la slection de tests.
nose
tox
tox est un outil pour automatiser la gestion de lenvironnement de test et les tests ciblant des configurations dinterpr-
teurs multiples
$ pip install tox
tox vous permet de configurer des matrices de test multi-paramtres complexes via un simple fichier de configuration
de type INI.
tox
Unittest2
unittest2 est un portage du module unittest Python 2.7 qui a une API amliore et de meilleures assertions par rapport
celui disponible dans les versions prcdentes de Python.
Si vous utilisez Python 2.6 ou infrieur, vous pouvez linstaller avec pip
Vous pouvez vouloir faire limport du module sous le nom unittest pour rendre le portage du code pour les nouvelles
versions du module plus facile dans le futur
class MyTest(unittest.TestCase):
...
De cette faon, si jamais vous basculez une version plus rcente de Python et navez plus besoin du module unittest2,
vous pouvez simplement changer limport dans votre module de test sans avoir besoin de changer aucun autre code.
unittest2
mock
unittest.mock est une bibliothque pour les tests en Python. A partir de Python 3.3, elle est disponible dans la
bibliothque standard.
Pour les versions anciennes de Python :
Il vous permet de remplacer les parties de votre systme en test avec des objets mock et de faire des assertions sur la
faon dont ils ont t utiliss.
Par exemple, vous pouvez monkey-patcher une mthode :
thing.method.assert_called_with(3, 4, 5, key='value')
Pour mocker des classes ou des objets dans un module en test, utilisez le dcorateur patch. Dans lexemple ci-
dessous, un systme de recherche externe est remplac par un mock qui retourne toujours le mme rsultat (mais
seulement pour la dure du test).
def mock_search(self):
class MockSearchQuerySet(SearchQuerySet):
def __iter__(self):
return iter(["foo", "bar", "baz"])
return MockSearchQuerySet()
Mock a beaucoup dautres faons pour que vous le configuriez et contrliez son comportement.
mock
Logging
Le module logging fait parti de la bibliothque standard de Python depuis la version 2.3. Il est succinctement dcrit
dans la PEP 282. La documentation est notoirement difficile lire, lexception du basic logging tutorial.
Le logging sert deux buts :
Le logging de diagnostic enregistre les vnements lis au fonctionnement de lapplication. Si un utilisateur
appelle pour signaler une erreur, par exemple, les logs peuvent tre recherchs pour avoir un contexte.
logging daudit enregistre les vnements pour lanalyse des affaires. Les transactions dun utilisateur peuvent
tre extraites et combines avec dautres dtails de lutilisateur pour les rapports ou pour optimiser un objectif
daffaires.
... ou Print ?
La seule fois que print est une meilleure option que le logging est lorsque lobjectif est dafficher une dclaration
daide pour une application en ligne de commande. Dautres raisons pour lesquelles le logging est mieux que print :
Le log record, qui a t cr avec chaque vnement de logging, contient des informations de diagnostic
facilement disponibles tels que le nom du fichier, le chemin complet, la fonction et le numro de ligne de
lvnement de logging.
Les vnements loggus dans les modules inclus sont automatiquement accessibles via la racine du logger au
flux de logs de votre application, moins que vous ne les filtriez.
Le logging peut tre rduite au silence de manire slective en utilisant la mthode
logging.Logger.setLevel() ou dsactive en dfinissant lattribut logging.Logger.disabled
True.
Les notes pour configuring logging for a library sont dans le logging tutorial. Parce que lutilisateur, pas la biblio-
thque, devrait dicter ce qui se passe quand un vnement de logging a lieu, une admonition accepter est de se
rpter :
Note : Il est fortement recommand de ne pas ajouter de handlers autres que NullHandler aux loggers de votre
bibliothque.
Les meilleures pratiques lors de linstanciation des loggers dans une bibliothque est de seulement les crer en utilisant
la variable globale __name__ : le module logging cre une hirarchie de loggers en utilisant la notation point, donc
utiliser __name__ assure labsence de collisions de noms.
Voici un exemple de bonne pratique depuis la requests source placez ceci dans votre __init__.py
# Set default logging handler to avoid "No handler found" warnings.
import logging
try: # Python 2.7+
from logging import NullHandler
except ImportError:
class NullHandler(logging.Handler):
def emit(self, record):
pass
2.6. Logging 39
Python Guide Documentation, Version 0.0.1
logging.getLogger(__name__).addHandler(NullHandler())
Le site twelve factor app, une rfrence faisant autorit pour les bonnes pratiques dans le dveloppement dapplica-
tion, contient une section sur les meilleures pratiques de logging. Elle prne avec insistance pour le traitement des
vnements de journal comme un flux dvnements, et pour envoyer ce flux dvnements la sortie standard pour
tre trait par lenvironnement dapplication.
Il y a au moins 3 manires de configurer un logger :
En utilisant un fichier format sous forme INI
Avantages : possible de mettre jour la configuration lors de lexcution en utilisant la fonction
logging.config.listen() pour couter sur un socket.
Inconvnients : moins de contrle (par exemple pour des loggers ou filtres comme sous-classes) que
possible lors de la configuration dun logger dans le code.
En utilisant un dictionnaire ou un fichier format sous forme JSON :
Avantages : en plus de la mise jour tout en excutant, il est possible de charger partir dun fichier
en utilisant le module json, dans la bibliothque standard depuis Python 2.6.
Inconvnients : moins de contrle que quand configuration dun logger dans le code.
En utilisant du code :
Avantages : contrle complet sur la configuration.
Inconvnients : modifications ncessitent un changement du code source.
Disons que le fichier est nomm logging_config.ini. Plus de dtails pour le format de fichier se trouvent dans
la section logging configuration du logging tutorial.
[loggers]
keys=root
[handlers]
keys=stream_handler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=stream_handler
[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)
[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
import logging
from logging.config import fileConfig
fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')
A partir de Python 2.7, vous pouvez utiliser un dictionnaire avec les dtails de configuration. La PEP 391 contient une
liste des lments obligatoires et optionnels dans le dictionnaire de configuration.
import logging
from logging.config import dictConfig
logging_config = dict(
version = 1,
formatters = {
'f': {'format':
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
},
handlers = {
'h': {'class': 'logging.StreamHandler',
'formatter': 'f',
'level': logging.DEBUG}
},
root = {
'handlers': ['h'],
'level': logging.DEBUG,
},
)
dictConfig(logging_config)
logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')
import logging
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
2.6. Logging 41
Python Guide Documentation, Version 0.0.1
Piges communs
Pour la plus grande partie, Python vise tre un langage propre et cohrent qui permet dviter des surprises. Cepen-
dant, il y a quelques cas qui peuvent tre sources de confusion pour les nouveaux arrivants.
Certains de ces cas sont intentionnels, mais peuvent tre potentiellement surprenants. Certains pourraient sans doute
tre considrs comme des verrues du langage. En gnral, ce qui suit est une collection de comportements potentiel-
lement dlicats qui pourraient sembler tranges premire vue, mais qui sont gnralement raisonnables une fois que
vous tes au courant de la cause sous-jacente de cette surprise.
Apparemment la surprise la plus commune que les nouveaux programmeurs Python rencontre est le traitement Python
des arguments par dfaut mutables dans les dfinitions de fonction.
my_list = append_to(12)
print my_list
my_other_list = append_to(42)
print my_other_list
Une nouvelle liste est cre chaque fois que la fonction est appele si un second argument nest pas fourni, de sorte
que la sortie est :
[12]
[42]
Ce qui se passe
[12]
[12, 42]
Une nouvelle liste est cre une seule fois quand la fonction est dfinie, et la mme liste est utilise dans chaque appel
successif.
Les arguments par dfaut de Python sont valus une seule fois lorsque la fonction est dfinie, pas chaque fois que la
fonction est appele (comme cest le cas, disons en Ruby). Cela signifie que si vous utilisez un argument par dfaut
mutable et le mutez, vous aurez mut largument ici et pour tous les futurs appels la fonction aussi.
Crez un nouvel objet chaque fois que la fonction est appele, en utilisant un argument par dfaut pour signaler que
aucun argument na t fourni (None est souvent un bon choix).
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to
Parfois, vous pouvez spcifiquement exploiter (lisez : utilis comme prvu) ce comportement pour maintenir ltat
entre les appels dune fonction. Cest souvent fait lors de lcriture dune fonction de mise en cache.
Une autre source de confusion est la manire dont Python bind ses variables dans les closures (ou dans la porte
globale entourante)
def create_multipliers():
return [lambda x : i * x for i in range(5)]
Une liste contenant cinq fonctions qui ont chacun leur propre variable i ferme sur elle-mme qui multiplie leur
argument, produisant :
0
2
4
6
8
Ce qui se passe
8
8
8
8
8
Cinq fonctions sont cres ; au lieu que toutes ne multiplient juste x par 4.
Les closures de Python sont des late binding. Cela signifie que les valeurs des variables utilises dans les closures sont
regardes au moment o la fonction interne est appele.
Ici, chaque fois que nimporte lesquelles des fonctions retournes sont appeles, la valeur de i est recherch dans la
porte environnante au moment de lappel. Dici l, la boucle est termine et i est laiss sa valeur finale de 4.
Ce qui est particulirement dplaisant sur ce pige est la dsinformation apparemment rpandue que cela a quelque
chose voir avec les lambdas en Python. Les fonctions cres avec une expression lambda ne sont en aucune faon
particulire, et en fait le mme comportement est expos en utilisant simplement un ordinaire def :
def create_multipliers():
multipliers = []
for i in range(5):
def multiplier(x):
return i * x
multipliers.append(multiplier)
return multipliers
La solution la plus gnrale est sans doute une forme de hack. En raison du comportement de Python dj mentionn
concernant lvaluation des arguments par dfaut aux fonctions (voir Arguments par dfaut mutables), vous pouvez
crer une closure qui se bind immdiatement ses arguments en utilisant un argument par dfaut comme ceci :
def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]
def create_multipliers():
return [partial(mul, i) for i in range(5)]
Parfois, vous voulez que vos closures se comportent de cette faon. Les late binding sont biens dans beaucoup de
situations. Boucler pour crer des fonctions uniques est malheureusement un cas o ils peuvent causer le hoquet.
Par dfaut, lors de lexcution du code Python partir de fichiers, linterprteur Python va automatiquement crire une
version bytecode de ce fichier sur le disque, par exemple module.pyc.
Ces fichiers .pyc ne doivent pas tre versionns dans vos dpts de code source.
Thoriquement, ce comportement est activ par dfaut, pour des raisons de performance. Sans ces fichiers bytecode
prsents, Python regnrerait le bytecode chaque fois que le fichier est charg.
Heureusement, le processus de gnration du bytecode est extrmement rapide, et nest pas quelque chose dont vous
avez besoin de vous soucier quand vous dveloppez votre code.
Ces fichiers sont ennuyeux, dbarrassons-nous deux !
$ export PYTHONDONTWRITEBYTECODE=1
Avec la variable denvironnement $PYTHONDONTWRITEBYTECODE dfinie, Python ncrira pas plus longtemps ces
fichiers sur le disque, et votre environnement de dveloppement restera agrable et propre.
Je recommande la dfinition de cette variable denvironnement dans votre ~/.profile.
Voici une astuce sympathique pour enlever tous ces fichiers, sils existent dj :
Excutez ceci depuis le rpertoire racine de votre projet, et tous les fichiers .pyc vont soudainement disparatre.
Beaucoup mieux.
Votre publication de source ncessite une licence. Aux Etats-Unis, si aucune licence est spcifie, les utilisateurs ont
pas le droit lgal de tlcharger, modifier ou distribuer. En outre, les gens ne peuvent pas contribuer votre code,
sauf si vous leur dites quelles sont les rgles pour jouer. Le choix dune licence est compliqu, alors voici quelques
conseils :
Open source. Il y a beaucoup de licences open source disponibles pour faire son choix.
En gnral, ces licences ont tendance tomber dans lune des deux catgories :
1. les licences qui se concentrent davantage sur la libert de lutilisateur faire ce quil veut avec le logiciel (ce
sont les licences open source plus permissives telles que le MIT, BSD et Apache).
2. les licences qui se concentrent davantage faire en sorte que le code lui-mme - y compris toutes les modifi-
cations apportes et distribues avec lui - restent toujours libres (ce sont les licences de logiciels libres moins
permissives telles que la GPL et LGPL).
Ces dernires sont moins permissives dans le sens o elles ne permettent pas quelquun dajouter du code au logiciel
et de le distribuer sans inclure galement le code source suite aux changements.
Pour vous aider en choisir une pour votre projet, il y a un site pour laide au choix de licence, utilisez-le.
Plus permissives
PSFL (Python Software Foundation License) pour la contribution Python lui-mme
MIT / BSD / ISC
MIT (X11)
New BSD
ISC
Apache
Moins permissives :
LGPL
GPL
GPLv2
GPLv3
Un bon aperu des licences avec des explications sur ce que lon peut, ne peut pas, et ce quon doit faire en utilisant
un logiciel en particulier peut tre trouv sur tl;drLegal.
Cette partie du guide se concentre sur les conseils pour les outils et modules bass sur les diffrents scnarios.
Applications rseau
HTTP
Le Hypertext Transfer Protocol (HTTP) est un protocole dapplication pour les systmes dinformation distribus,
collaboratifs et hypermdia. HTTP est le fondement de la communication de donnes pour le World Wide Web.
Requests
Le module urllib2 de la bibliothque standard Python fournit la plupart des fonctionnalits HTTP dont vous avez
besoin, mais lAPI est compltement casse. Il a t cr pour une autre priode - et un web diffrent. Il ncessite une
norme quantit de travail (mme avec les surcharges de mthode) pour effectuer la plus simple des tches.
Requests prend la main sur tout le travail effectu sur HTTP par Python - rendant votre intgration avec des services
Web parfaite. Il ny a pas besoin dajouter manuellement les chanes de requte vos URL, ou encoder vos donnes
POST comme des formulaires. Keep-alive et le pooling de connexion HTTP sont 100% automatiques, motoriss par
urllib3, qui est encapsule dans Requests.
Documentation
PyPi
GitHub
Systmes distribus
ZeroMQ
MQ (crit aussi ZeroMQ, 0MQ ou ZMQ) est une bibliothque de messaging asynchrone haute performance destine
une utilisation dans des applications distribues scalables ou concurrentes. Il fournit une queue de messages, mais
contrairement un middleware orient message, un systme MQ peut fonctionner sans un broker de message ddi.
La bibliothque est conue pour avoir une API familire dans le style des sockets.
RabbitMQ
RabbitMQ est un logiciel open source de type broker de messages qui implmente Advanced Message Queuing Proto-
col (AMQP). Le serveur RabbitMQ est crit dans le langage de programmation Erlang et est construit sur le framework
47
Python Guide Documentation, Version 0.0.1
Open Telecom Platform pour le clustering et le failover. Des bibliothques clientes pour sinterfacer avec le broker
sont disponibles pour tous les principaux langages de programmation.
Page daccueil
Organisation GitHub
Applications Web
En tant que puissant langage de scripting adapt la fois au prototypage rapide et de plus gros projets, Python est
largement utilis dans le dveloppement dapplications web.
Contexte
WSGI
Le Web Server Gateway Interface (ou WSGI pour faire court) est une interface standard entre les serveurs Web
et les frameworks web Python. En normalisant le comportement et la communication entre les serveurs Web et les
frameworks web Python, WSGI permet dcrire du code web Python portable qui peut tre dploy dans tout serveur
Web conforme WSGI. WSGI est documente dans la PEP 3333.
Frameworks
Dune manire gnrale, un framework web se compose dun ensemble de bibliothques et un gestionnaire principal
au sein duquel vous pouvez construire un code personnalis pour implmenter une application Web (par exemple, un
site web interactif). La plupart des frameworks web incluent des modles et des utilitaires pour accomplir au moins ce
qui suit :
Routing dURL Fait correspondre une requte HTTP entrante vers un bout de code Python particulier pour tre
invoqu
Objets Requte et Rponse Encapsule linformation reue ou expdie au navigateur dun utilisateur
Moteur de template Permet la sparation du code Python implmentant la logique dune application de la sortie
HTML (ou autre) quelle produit
Serveur web de dveloppement Excute un serveur HTTP sur les machines de dveloppement pour permettre
un dveloppement rapide ; souvent recharge automatiquement le code ct serveur quand les fichiers sont mis
jour
Django
Django est un framework dapplication web tout en un, et est un excellent choix pour la cration de sites Web orients
contenu. En fournissant utilitaires et patterns par dfaut, Django a pour but de permettre de construire rapidement des
applications web complexes Web, reposant sur des base de donnes, tout en encourageant les bonnes pratiques dans le
code crit qui lutilise.
Django a une communaut importante et active, et de nombreux modules pr-construits rutilisables qui peuvent tre
incorpors dans un nouveau projet tel quel, ou personnalis pour rpondre vos besoins.
Il y a des confrences annuelles de Django aux tats-Unis et en Europe.
La majorit des nouvelles applications web Python daujourdhui sont construites avec Django.
Flask
Flask est un microframework pour Python, et est un excellent choix pour la construction de petites applications,
dAPIs et des services Web.
Construire une application avec Flask est un peu comme lcriture des modules standards de Python, sauf certaines
fonctions ont des routes qui leur sont rattaches. Cest vraiment trs beau.
Plutt que de viser fournir tout ce dont vous pourriez avoir besoin, Flask implmente les composants noyaux les plus
couramment utiliss dun framework web, comme le routage dURL, les objets request et response et les templates.
Si vous utilisez Flask, cest vous de choisir dautres composants pour votre application, le cas chant. Par exemple,
laccs aux base de donnes ou la gnration et la validation de formulaires ne sont pas des fonctions natives dans
Flask.
Cest super, car de nombreuses applications Web ne ncessitent pas ces fonctionnalits. Pour celles qui en ont besoin,
il y a de nombreuses extensions disponibles qui peuvent rpondre vos besoins. Ou, vous pouvez facilement utiliser
toute bibliothque dont vous voulez vous-mme !
Flask est le choix par dfaut pour toutes les applications web Python qui ne sont pas adaptes Django.
Tornado
Tornado est un framework web asynchrone pour Python qui a sa propre boucle dvnements. Cela lui permet de
supporter nativement les WebSockets, par exemple. Les applications Tornado bien crites sont connues pour avoir
dexcellentes performances.
Je ne recommande pas dutiliser Tornado sauf si vous pensez que vous en avez besoin.
Pyramid
Pyramid est un framework trs souple se concentrant fortement sur la modularit. Il est livr avec un petit nombre de
bibliothques (toutes en unes) intgres, et encourage les utilisateurs tendre ses fonctionnalits de base.
Pyramid na pas une grosse base dutilisateurs, contrairement Django et Flask. Cest un framework intelligent, mais
pas un choix trs populaire pour les nouvelles applications web Python de nos jours.
Serveurs web
Nginx
Nginx (prononc engine-x ) est un serveur web et un reverse-proxy pour HTTP, SMTP et dautres protocoles. Il est
connu pour sa haute performance, la simplicit relative, et sa compatibilit avec de nombreux serveurs dapplications
(comme les serveurs WSGI). Il inclut aussi des fonctionnalits pratiques comme le load-balancing, lauthentification
basique, le streaming, et dautres encore. Conu pour servir des sites forte charge, Nginx est progressivement en train
de devenir populaire.
Serveurs WSGI
Les serveurs WSGI autonomes utilisent gnralement moins de ressources que les serveurs web traditionnels et offrent
les meilleures performances 3 .
3. Benchmark de serveurs WSGI Python
Gunicorn
Gunicorn (Green Unicorn) est un serveur de WSGI en pur-python utilis pour servir des applications Python. Contrai-
rement dautres serveurs web Python, il a une interface utilisateur rflchie, et est extrmement facile utiliser et
configurer.
Gunicorn a des configurations par dfaut saines et raisonnables. Cependant, certains autres serveurs, comme uWSGI,
sont largement plus personnalisables, et par consquent, sont beaucoup plus difficiles utiliser efficacement.
Gunicorn est le choix recommand pour de nouvelles applications Python web aujourdhui.
Waitress
Waitress est un serveur de WSGI pur-python qui affirme avoir des performances trs acceptables. Sa documentation
est pas trs dtaille, mais elle offre quelques fonctionnalits intressantes que Gunicorn na pas (par exemple la mise
en mmoire tampon de requte HTTP).
Waitress gagne en popularit au sein de la communaut de dveloppement web Python.
uWSGI
uWSGI est une pile complte pour construire des services dhbergement. En plus de la gestion des processus, la
surveillance des processus, et dautres fonctionnalits, uWSGI agit comme un serveur dapplications pour diffrents
langages de programmation et protocoles - y compris Python et WSGI. uWSGI peut soit tre excut comme un routeur
Web autonome, ou tre excut derrire un serveur web complet (comme Nginx ou Apache). Dans ce dernier cas, un
serveur Web peut configurer uWSGI et le fonctionnement dune application par dessus le protocole uwsgi. Le support
dun serveur Web uWSGI permet la configuration dynamique de Python, en passant des variables denvironnement et
plus de rglages. Pour plus de dtails, reportez-vous aux variables magiques uWSGI.
Je ne recommande pas dutiliser uWSGI sauf si vous savez pourquoi vous en avez besoin.
La majorit des applications auto-hberges Python aujourdhui est hberge avec un serveur WSGI tels que Gunicorn,
soit directement, soit derrire un serveur web lger tel que nginx.
Les serveurs WSGI servent les applications Python pendant que le serveur Web gre les tches mieux adaptes pour
lui comme la mise disposition des fichiers statiques, les requtes de routage, la protection DDoS, et lauthentification
basique.
Hbergement
Un Platform-as-a-Service (PaaS) est un type dinfrastructure de cloud computing qui fait abstraction et gre linfra-
structure, le routage et le scaling des applications Web. Lorsque vous utilisez un PaaS, les dveloppeurs dapplications
peuvent se concentrer sur lcriture du code de lapplication plutt que de se proccuper des dtails du dploiement.
Heroku
Heroku offre un soutien de premire classe pour les applications Python 2,73,5
Heroku supporte tous les types dapplications Python Web, serveurs et frameworks. Les applications peuvent tre
dveloppes sur Heroku gratuitement. Une fois que votre application est prte pour la production, vous pouvez passer
votre application en formule Hobby ou Professional.
Heroku maintient des articles dtaills sur lutilisation de Python avec Heroku, ainsi que des instructions pas pas sur
comment configurer votre premire application.
Heroku est le PaaS recommand pour le dploiement dapplications web Python aujourdhui.
Gondor
Gondor est un PaaS spcialis pour le dploiement dapplications Django et Pinax. Gondor recommande Django
version 1.6 et prend en charge toutes les applications WSGI sur Python version 2.7. Gondor peut configurer automati-
quement votre site Django si vous utilisez local_settings.py pour les informations de configuration spcifiques
au site.
Gondor a un guide sur le dploiement de projets Django.
Gondor est gr par une petite entreprise et se concentre pour aider les entreprises trouver le succs avec Python et
Django.
Templating
La plupart des applications WSGI rpondent des requtes HTTP pour servir du contenu en HTML ou dautres
langages de balisage. Au lieu de gnrer directement le contenu textuel depuis Python, le concept de sparation des
problmes nous conseille dutiliser des templates. Un moteur de template gre un ensemble de fichiers de templates,
avec un systme de hirarchie et dinclusion pour viter des rptitions inutiles, et est en charge du rendu (gnra-
tion) du contenu proprement dit, remplissant le contenu statique des templates avec le contenu dynamique gnr par
lapplication .
Comme les fichiers de template sont parfois crits par des designers ou dveloppeurs front-end, il peut tre difficile de
grer une complexit croissante.
Quelques bonnes pratiques gnrales sappliquent la partie de lapplication qui passe le contenu dynamique au
moteur de template, et aux templates eux-mmes
Les fichiers de template ne doivent passer que le contenu dynamique ncessaire pour faire le rendu du template.
vitez la tentation de passer du contenu supplmentaire juste au cas o : il est plus facile dajouter une
variable manquante en cas de besoin que de supprimer une variable inutilise plus tard.
Beaucoup de moteurs de template des dclarations complexes ou des affectations dans le template lui-mme,
et beaucoup autorisent quun peu de code Python soit valu dans les templates. Cette facilit peut entraner
une augmentation incontrle de la complexit, et souvent rendre plus difficile de trouver les bugs.
Il est souvent ncessaire de mlanger les templates JavaScript avec des templates HTML. Une approche saine
cette conception est disoler les parties o le template HTML passe un contenu variable au code JavaScript.
Jinja2
{# Tag for a block, can be replaced through inheritance with other html code #}
{% block head %}
<h1>This is the head!</h1>
{% endblock %}
Lensemble des listings suivants est un exemple de site web en combinaison avec le serveur web Tornado. Tornado est
pas trs compliqu utiliser.
# import Jinja2
from jinja2 import Environment, FileSystemLoader
# import Tornado
import tornado.ioloop
import tornado.web
Le fichier base.html peut tre utilis comme base pour toutes les pages du site qui sont par exemple implmentes
dans le bloc de contenu.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" href="style.css" />
<title>{{title}} - My Webpage</title>
</head>
<body>
<div id="content">
{# In the next line the content from the site.html template will be added #}
{% block content %}{% endblock %}
</div>
<div id="footer">
{% block footer %}
© Copyright 2013 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</div>
</body>
Le prochain listing est notre page de site (site.html) charg dans lapplication Python qui tend base.html. Le
bloc de contenu est automatiquement dfini dans le bloc correspondant dans la page base.html.
<!{% extends "base.html" %}
{% block content %}
<p class="important">
<div id="content">
<h2>{{title}}</h2>
<p>{{ list_title }}</p>
<ul>
{% for item in list %}
<li>{{ item[0]}} : {{ item[1]}}</li>
{% endfor %}
</ul>
</div>
</p>
{% endblock %}
Jinja2 est la bibliothque de templating recommande pour les nouvelles applications Python web.
Chameleon
Les Page Templates de Chameleon sont limplmentation dans un moteur de template HTML/XML des syntaxes
Template Attribute Language (TAL), TAL Expression Syntax (TALES), et Macro Expansion TAL (Metal).
Chameleon est disponible pour Python 2.5 et plus (y compris 3.x et pypy), et est couramment utilis par le Framework
Pyramid.
Page Templates ajoute au sein de votre structure de document des lments dattributs spciaux et du texte de
markup. En utilisant un ensemble de constructions de langage simples, vous contrlez le flux du document, la rptition
dlment , le remplacement de texte et de la traduction. A cause de la syntaxe base sur des attributs, les templates
de page non-rendus sont valides HTML et peuvent tre regards dans un navigateur et mme dits dans des diteurs
WYSIWYG. Cela peut permettre la collaboration par aller-retour avec des designers et le prototypage avec des fichiers
statiques dans un navigateur plus facile.
Le langage TAL de base est assez simple comprendre partir dun exemple :
<html>
<body>
<h1>Hello, <span tal:replace="context.name">World</span>!</h1>
<table>
<tr tal:repeat="row 'apple', 'banana', 'pineapple'">
<td tal:repeat="col 'juice', 'muffin', 'pie'">
<span tal:replace="row.capitalize()" /> <span tal:replace="col" />
</td>
</tr>
</table>
</body>
</html>
Le pattern <span tal :replace=expression /> pour linsertion de texte est suffisamment courant pour que vous ne
demandiez pas une validit stricte dans vos templates non-rendus. Vous pouvez le remplacer par une syntaxe plus
concise et lisible qui utilise le pattern ${expression}, comme suit :
<html>
<body>
<h1>Hello, ${world}!</h1>
<table>
<tr tal:repeat="row 'apple', 'banana', 'pineapple'">
<td tal:repeat="col 'juice', 'muffin', 'pie'">
${row.capitalize()} ${col}
</td>
</tr>
</table>
</body>
</html>
Mais gardez lesprit que la syntaxe complte <span tal :replace=expression>texte par dfaut</span> permet
aussi davoir un contenu par dfaut dans le modle non-rendu.
Venant du monde Pyramid, Chameleon nest pas largement utilis.
Mako
Mako est un langage de template qui compile en Python pour une performance maximale. Sa syntaxe et son api
sont empruntes des meilleures parties dautres langages de templating comme les modles Django et Jinja2. Il est le
langage de template par dfaut inclus avec les frameworks web Pylons et Pyramid.
Un template exemple en Mako ressemble ceci :
<%inherit file="base.html"/>
<%
rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
% for row in rows:
${makerow(row)}
% endfor
</table>
<%def name="makerow(row)">
<tr>
% for name in row:
<td>${name}</td>\
% endfor
</tr>
</%def>
Pour faire le rendu dun template trs basique, vous pouvez faire ce qui suit :
Rfrences
Scraping HTML
Web Scraping
Les sites web sont crits en utilisant HTML, ce qui signifie que chaque page Web est un document structur. Parfois,
il serait bien dobtenir des donnes partir delles et de prserver la structure pendant que nous y sommes. Les sites
web ne fournissent pas toujours leurs donnes dans des formats confortables tels que le csv ou json.
Cest l o le web scraping entre en jeu. Le web scraping est la pratique dutiliser un programme dordinateur pour
passer au crible dune page Web et de recueillir les donnes dont vous avez besoin dans un format plus utile pour vous
tout en prservant la structure de la donne.
lxml et Requests
lxml est une bibliothque assez tendue, crite pour analyser des documents XML et HTML trs rapidement, mani-
pulant mme des balises invalides au cours du processus. Nous allons aussi utiliser le module Requests la place du
module urllib2 natif cause damliorations en terme de vitesse et de lisibilit. Vous pouvez facilement installer les
deux en utilisant pip install lxml et pip install requests.
Commenons avec les imports :
from lxml import html
import requests
Ensuite, nous utiliserons requests.get pour rcuprer la page web avec notre donne, la parser en utilisant le
module html et sauver les rsultats dans tree :
page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)
(Nous avons besoin dutiliser page.content plutt que page.text parce que html.fromstring attend im-
plicitement des bytes en entre.)
tree contient maintenant le fichier HTML entier dans une belle structure arborescente que nous pouvons parcourir
de deux faons diffrentes : XPath et CSSSelect. Dans cet exemple, nous allons nous concentrer sur le premier.
XPath est un moyen de trouver de linformation dans des documents structurs tels que des documents HTML ou
XML. Une bonne introduction XPath est sur W3Schools .
Il existe galement divers outils pour obtenir le XPath dlments comme Firebug pour Firefox ou lInspecteur
Chrome. Si vous utilisez Chrome, vous pouvez faire un clic droit sur un lment, choisissez Inspecter, mettez en
surbrillance le code, faites un clic droit nouveau et choisissez Copy puis Copy XPath
Aprs une analyse rapide, nous voyons que dans notre page les donnes sont contenues dans deux lments - lun est
une div avec le titre buyer-name et lautre est un span avec la classe item-price :
<div title="buyer-name">Carson Busses</div>
<span class="item-price">$29.95</span>
Sachant cela, nous pouvons crer la requte XPath correcte et utiliser la fonction xpath lxml comme ceci :
#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')
Flicitations ! Nous avons scrap avec succs toutes les donnes que nous voulions partir dune page Web en utilisant
lxml et Requests. Nous les avons stock en mmoire, dans deux listes. Maintenant, nous pouvons faire toutes sortes
de trucs cools avec elles : nous pouvons lanalyser en utilisant Python ou nous pouvons lenregistrer dans un fichier et
les partager avec le monde.
Quelques ides plus cools sur lesquelles rflchir sont de modifier ce script pour parcourir le reste des pages de ce jeu
de donnes exemple, ou la rcriture de cette application pour utiliser les threads pour amliorer la vitesse.
Les applications en ligne de commande, galement appeles Applications console, sont des programmes informatiques
conus pour tre utiliss partir dune interface texte, telle quun shell. Les applications en ligne de commande
acceptent gnralement diffrentes entres comme arguments, souvent appels paramtres ou sous-commandes, aussi
bien que options, souvent dsignes comme flags ou switches.
Quelques applications en ligne de commande populaires incluent :
Grep - un utilitaire de recherche de donnes en texte-plein
curl - un outil pour le transfert de donnes avec une syntaxe URL
httpie - un client HTTP en ligne de commande, un remplaant de cURL convivial
git - Un systme de gestion de version distribu
mercurial - Un systme de gestion de version distribu principalement crit en Python
Clint
clint est un module Python qui est contient plein doutils trs utiles pour le dveloppement dapplications en ligne de
commande. Il prend en charge des fonctionnalits telles que ; la couleur et lindentation de la console/invite, limpres-
sion de colonnes simple et puissante, les barres de progression bases sur des itrateurs et la manipulation dargument
implicite.
Click
click est un package Python venir pour crer des interfaces de ligne de commande dune manire composable avec
le moins de code possible. Cette Command-Line Interface Creation Kit est hautement configurable, mais est livre
avec une bonne configuration par dfaut directement.
docopt
docopt est un paquet trs lger et trs Pythonique qui permet de crer des interfaces de ligne de commande simple et
intuitive, en parsant les instructions dusage dans le style de POSIX.
Plac
Plac est un simple wrapper sur la bibliothque standard Python argparse, qui cache la majeure partie de sa complexit
en utilisant une interface dclarative : le parser dargument est infr plutt qucrit de manire imprative. Ce module
cible en particulier les utilisateurs non-avertis, les programmeurs, les administrateurs systme, les scientifiques et en
gnral les gens qui crivent des scripts jetables pour eux-mmes, qui choisissent de crer une interface de ligne de
commande, car cest rapide et simple.
Cliff
Cliff est un framework pour construire des programmes en ligne de commande. Il utilise les points dentre de setup-
tools pour fournir des sous-commandes, des formatteurs de sortie, et dautres extensions. Le framework est destin
tre utilis pour crer des commandes plusieurs niveaux tels que subversion et git, o le programme principal gre
le parsing dargument de base, puis invoque une sous-commande pour faire le travail.
Camelot
Camelot fournit des composants pour construire des applications par dessus Python, SQLAlchemy et Qt. Il est inspir
par linterface dadministration de Django.
La ressource principale pour des informations est le site web : http://www.python-camelot.com and the mailing list
https://groups.google.com/forum/#!forum/project-camelot
Cocoa
Note : Le framework Cocoa est uniquement disponible sur OS X. Ne lutilisez pas si vous crivez une application
multi-plateformes.
GTk
PyGTK fournit des bindings Python pour la bote outils GTK+. Comme la bibliothque GTK+ elle-mme, il est
actuellement sous licence GNU LGPL. Il est intressant de noter que PyGTK ne supporte actuellement que lAPI
Gtk-2.X (PAS Gtk-3.0). Il est actuellement recommand de ne pas utiliser PyGTK pour les nouveaux projets et que
les applications existantes soient portes de PyGTK PyGObject.
PyGObject fournit des bindings Python, qui donnent un accs complet la plate-forme logicielle GNOME. Il est
entirement compatible avec GTK+ 3. Voici un tutoriel pour commencer intitul Python GTK+ 3 Tutorial.
Rfrence de lAPI
Kivy
Kivy est une bibliothque Python pour le dveloppement dapplications riches en mdia supportant le multi-touch.
Lobjectif est de permettre la conception dinteraction rapide et facile et le prototypage rapide, tout en rendant votre
code rutilisable et dployable.
Kivy est crit en Python, bas sur OpenGL et supporte les diffrents dispositifs dentre tels que : souris, la souris
double, TUIO, WiiMote, WM_TOUCH, HIDtouch, les produits dApple et ainsi de suite.
Kivy est activement dvelopp par une communaut et est libre utiliser. Il fonctionne sur toutes les principales
plateformes (Linux, OSX, Windows, Android).
La ressource principale pour des informations est le site web : http://kivy.org
PyObjC
Note : Uniquement disponible sur OS X. Ne lutilisez pas si vous crivez une application multi-plateformes.
PySide
PyQt
Note : Si votre logiciel ne se conforme pas compltement la GPL, vous aurez besoin dune licence commerciale !
PyjamasDesktop est un port de Pyjamas. PyjamasDesktop est un jeu de widgets pour applications prvu pour le bu-
reautique et un framework multi-plateformes. (Aprs la mise disposition de la v0.6, PyjamasDesktop est un morceau
de Pyjamas (Pyjs)). En bref, il permet au mme code dune application web Python dtre excut comme une appli-
cation de bureau autonome.
Wiki Python pour PyjamasDesktop.
Le site principal ; pyjs Desktop.
Qt
Qt est un framework multi-plateformes qui est largement utilis pour dvelopper de logiciels avec une interface gra-
phique, mais peut galement tre utilis pour des applications sans interface graphique.
Tk
Tkinter est une mince couche oriente par dessus Tcl/Tk. Il a lavantage dtre inclus dans la bibliothque standard
Python, ce qui le rend la bote outils la plus pratique et compatible pour programmer.
Tk et Tkinter sont tous les deux disponibles sur la plupart des plateformes Unix, ainsi que sur les systmes Windows
et Macintosh. Depuis la version 8.0, Tk offre une apparence et une impression native sur toutes les plateformes.
Il y a un bon tutoriel Tk multi-langages avec des exemples Python sur TkDocs. Plus dinformations sont disponibles
sur Wiki Python.
wxPython
wxPython est une bote outils dinterface graphique pour le langage de programmation Python. Il permet aux pro-
grammeurs Python de crer des programmes avec une interface utilisateur graphique robuste, trs fonctionnel, simple
et facile. Il est implment comme un module dextension Python (code natif) qui enveloppe la populaire bibliothque
graphique multi-plateformes wxWidgets, qui est crite en C ++.
Installez wxPython (Stable) allez sur http ://www.wxpython.org/download.php#stable et tlchargez le paquet ap-
propri pour votre systme dexploitation.
Bases de donnes
DB-API
La Database API (DB-API) de Python dfinit une interface standard pour les modules daccs une base de donnes.
Elle est documente dans la PEP 249. Presque tous les modules de base de donnes Python comme sqlite3, psycopg
et mysql-python se conforment cette interface.
Tutoriels qui expliquent comment travailler avec les modules qui sont conformes cette interface peuvent tre trouvs
ici et ici.
SQLAlchemy
SQLAlchemy est une bote outils pour base de donnes largement utilise. Contrairement de nombreuses bi-
bliothques de base de donnes, il ne fournit pas seulement une couche ORM, mais aussi une API gnralise pour
lcriture du code agnostique aux bases de donnes, sans SQL.
Records
Records est une bibliothque de SQL minimaliste, conue pour envoyer des requtes SQL brutes diverses bases de
donnes. Les donnes peuvent tre utilises par programmation, ou exportes vers un certain nombre de formats de
donnes utiles.
Inclut aussi un outil de ligne de commande for exporter les donnes SQL.
Django ORM
Django ORM est linterface utilise par Django pour fournir laccs aux bases de donnes.
Cest bas sur lide des modles, une abstraction qui rend plus facile de manipuler des donnes dans Python.
Les basiques :
Chaque modle est une classe Python qui sous-classe django.db.models.Model.
Chaque attribut du modle reprsente un champ de base de donnes.
Django vous donne une API daccs aux bases de donnes gnrs automatiquement ; voir Faire des requtes.
peewee
peewee est un autre ORM dont le but est dtre lger avec le support de Python 2.6+ et 3.2+, qui supporte SQLite,
MySQL et Postgres par dfaut. La couche du modle est similaire celle de Django ORM et il a des mthodes de
type SQL pour requter les donnes. Alors que SQLite, MySQL et Postgres sont pris en charge directement, il y a une
collection dadd-ons disponible.
PonyORM
PonyORM est un ORM qui prend une approche diffrente pour interroger la base de donnes. Au lieu dcrire un
langage similaire SQL ou des expressions boolennes, la syntaxe pour les gnrateurs Python est utilise. Il y a aussi
un diteur de schma graphique qui peut gnrer des entits PonyORM pour vous. Il supporte Python 2.6+ et Python
3.3+ et peut se connecter SQLite, MySQL, PostgreSQL et Oracle
SQLObject
SQLObject est encore un autre ORM. Il prend en charge une grande varit de bases de donnes : des systmes de base
de donnes communs comme MySQL, Postgres et SQLite et des systmes plus exotiques comme SAP DB, SyBase et
MSSQL. Il supporte seulement Python 2 partir de Python 2.6 et suprieur.
Rseau
Twisted
Twisted est un moteur rseau pilot par vnement. Il peut tre utilis pour construire des applications autour de
nombreux protocoles rseau diffrents, incluant les serveurs et les clients http, les applications utilisant les protocoles
SMTP, POP3, IMAP ou SSH, la messagerie instantane et plus encore.
PyZMQ
PyZMQ est le binding Python pour ZeroMQ, qui est une bibliothque de messagerie asynchrone haute performance.
Un grand avantage de ZeroMQ est quil peut tre utilis pour la gestion de queue de messages sans broker de messages.
Les patterns de base pour cela sont :
request-reply : connecte un jeu de clients un jeu de services ; Cest un pattern dappel de procdure distance
et de distribution de tches
publish-subscribe : connecte un jeu de publicateurs un jeu dabonns. Cest un pattern de distribution de
donnes.
push-pull (ou pipeline) : connecte les nuds suivant un pattern fan-in / fan-out qui peut avoir plusieurs tapes,
et des boucles. Cest un pattern de rpartition et de collecte de tches en parallle.
Pour un dmarrage rapie, lire le guide ZeroMQ.
gevent
gevent est une bibliothque de rseau de Python base sur les coroutines qui utilise greenlets pour fournir une API
synchrone de haut niveau sur le dessus de la boucle dvnement de libev.
Administration systme
Fabric
Fabric est une bibliothque pour simplifier les tches dadministration du systme. Alors que Chef et Puppet ont
tendance se concentrer sur la gestion des serveurs et des bibliothques du systme, Fabric est plus concentr sur des
tches au niveau des applications telles que le dploiement.
Installer Fabric :
Le code suivant va crer deux tches que nous pouvons utiliser : memory_usage et deploy. La premire va
retourner lutilisation de la mmoire sur chaque machine. La dernire va se connecter en ssh sur chaque serveur, faire
un cd dans notre rpertoire de projet, activer lenvironnement virtuel, faire un pull de la base de code la plus rcente et
redmarrer le serveur dapplications.
@task
def memory_usage():
run('free -m')
@task
def deploy():
with cd('/var/www/project-env/project'):
with prefix('. ../bin/activate'):
run('git pull')
run('touch app.wsgi')
Avec le code prcdent enregistr dans un fichier nomm fabfile.py, nous pouvons vrifier lutilisation de la
mmoire avec :
$ fab memory_usage
[my_server1] Executing task 'memory'
[my_server1] run: free -m
[my_server1] out: total used free shared buffers cached
[my_server1] out: Mem: 6964 1897 5067 0 166 222
[my_server1] out: -/+ buffers/cache: 1509 5455
$ fab deploy
Des fonctionnalits additionnelles incluent lexcution en parallle, linteraction avec les programmes distance, et le
regroupement dhtes.
Documentation Fabric
Salt
Salt est un outil de gestion dinfrastructure open source. Il supporte lexcution de commandes distance partir dun
point central (hte matre) plusieurs htes (minions). Il supporte galement des tats systme qui peuvent tre utiliss
pour configurer plusieurs serveurs laide de fichiers modle simples.
Salt supporte les versions de Python 2.6 et 2.7 et peut tre install via pip :
Aprs avoir configur un serveur matre et un nimporte quel nombre dhtes de minion, nous pouvons excuter des
commandes shell arbitraires ou utiliser des modules pr-intgrs de commandes complexes sur nos minions.
La commande suivante liste tous les htes de minion disponibles, en utilisant le module ping.
Le filtrage de lhte est accompli en faisant correspondre lidentifiant du minion, ou en utilisant le systme de grains. Le
systme grains utilise des informations dhte statique comme la version du systme dexploitation ou de larchitecture
du processeur pour fournir une taxonomie dhte pour les modules Salt.
La commande suivante liste tous les minions disponibles excutant CentOS, en utilisant le systme grains.
Salt propose galement un systme dtat. Les tats peuvent tre utiliss pour configurer les htes de minion.
Par exemple, quand un hte de minion est command de lire le fichier dtat suivant, il va installer et dmarrer le
serveur Apache :
apache:
pkg:
- installed
service:
- running
- enable: True
- require:
- pkg: apache
Les fichiers dtat peuvent tre crit en utilisant le YAML, le systme de template Jinja2 ou du Python pur.
Documentation Salt
Psutil
Psutil est une interface pour diffrentes informations systme (par exemple, le CPU, la mmoire, les disques, le rseau,
les utilisateurs et les processus).
Voici un exemple pour tre au courant de la surcharge dun serveur. Si lun des tests (net, CPU) choue, il va envoyer
un e-mail.
# Functions to get system values:
from psutil import cpu_percent, net_io_counters
# Functions to take a break:
from time import sleep
# Package for email services:
import smtplib
import string
MAX_NET_USAGE = 400000
MAX_ATTACKS = 4
attack = 0
counter = 0
while attack <= MAX_ATTACKS:
sleep(4)
counter = counter + 1
# Check the cpu usage
if cpu_percent(interval = 1) > 70:
attack = attack + 1
# Check the net usage
neti1 = net_io_counters()[1]
neto1 = net_io_counters()[0]
sleep(1)
neti2 = net_io_counters()[1]
neto2 = net_io_counters()[0]
# Calculate the bytes per second
net = ((neti2+neto2) - (neti1+neto1))/2
if net > MAX_NET_USAGE:
attack = attack + 1
if counter > 25:
attack = 0
counter = 0
# Write a very important email if attack is higher than 4
TO = "you@your_email.com"
FROM = "webmaster@your_domain.com"
SUBJECT = "Your domain is out of system resources!"
text = "Go and fix your server!"
BODY = string.join(("From: %s" %FROM,"To: %s" %TO,"Subject: %s" %SUBJECT, "",text), "\r\n")
server = smtplib.SMTP('127.0.0.1')
server.sendmail(FROM, [TO], BODY)
server.quit()
Une application complte dans le terminal similaire une version de top trs tendue, base sur psutil et avec une
capacit de monitoring client-serveur est glance.
Ansible
Ansible est un outil dautomatisation systme open source. Le plus grand avantage sur Puppet ou Chef est quil ne
ncessite pas un agent sur la machine cliente. Les playbooks sont la configuration, le dploiement, et le langage
dorchestration dAnsible. Ils sont rdigs en YAML avec Jinja2 pour le templating.
Ansible supporte les versions 2.6 et 2.7 de Python et peut tre install via pip :
Ansible ncessite un fichier inventory qui dcrit les htes auxquels il a accs. Voici ci-dessous un exemple dun hte
et dun playbook qui va faire un ping sur tous les htes dans le fichier inventory.
Voici un exemple de fichier inventory : hosts.yml
[server_name]
127.0.0.1
tasks:
- name: ping
action: ping
Le playbook Ansible fera un ping sur tous les serveurs dans le fichier hosts.yml. Vous pouvez galement slection-
ner des groupes de serveurs utilisant Ansible. Pour plus dinformations sur Ansible, lisez la documentation Ansible
<http ://docs.ansible.com/> _.
An Ansible tutorial est aussi une bonne introduction, bien dtaille, pour commencer avec Ansible.
Chef
Chef est un framework dautomatisation systme et infrastructure cloud qui rend facile de dployer des serveurs et des
applications tout emplacement physique, virtuelle ou dans le cloud. Dans le cas o cest votre choix pour la gestion
de la configuration, vous utiliserez principalement Ruby pour crire votre code dinfrastructure.
Les clients Chef sexcutent sur chaque serveur qui fait partie de votre infrastructure et ceux-ci vrifient rgulirement
avec votre serveur Chef pour assurer que votre systme est toujours align et reprsente ltat dsir. tant donn
que chaque serveur possde son propre client Chef distinct, chaque serveur se configure lui-mme et cette approche
distribue fait de Chef une plate-forme dautomatisation volutive.
Chef fonctionne en utilisant des recettes personnalises (lments de configuration), implments dans des cookbooks.
Les cookbooks, qui sont essentiellement des paquets pour des choix dinfrastructure, sont gnralement stocks dans
votre serveur Chef. Lisez la srie de tutoriels de Digital Ocean sur Chef pour apprendre comment crer un Serveur
Chef simple.
Pour crer un cookbook simple, la commande knife est utilise :
knife cookbook create cookbook_name
Getting started with Chef est un bon point de dpart pour les dbutants en Chef. De nombreux cookbooks mainte-
nus par la communaut qui peuvent servir comme une bonne rfrence ou personnaliss pour servir vos besoins de
configuration de infrastructure peuvent tre trouvs sur le Supermarket Chef.
Documentation Chef
Puppet
Puppet est un logiciel de gestion de configuration et dautomatisation de Puppet Labs qui permet aux administrateurs
systme de dfinir ltat de leur infrastructure informatique, fournissant ainsi une manire lgante de grer leur flotte
de machines physiques et virtuelles.
Puppet est disponible la fois en variante Open Source et Entreprise. Les modules sont de petites units de code
partageables crites pour automatiser ou dfinir ltat dun systme. La forge Puppet est un dpt pour les modules
crits par la communaut pour Puppet Open Source et Entreprise.
Les agents de Puppet sont installs sur des nuds dont ltat doit tre contrl ou chang. Un serveur dsign connu
comme le Puppet Master est responsable de lorchestration de lagent des nuds.
Lagent des nuds envoie des facts de base propos du systme comme le systme dexploitation, le kernel, ladresse
ip, le nom dhte, etc. au Puppet Master. Le Puppet Master ensuite compile un catalogue avec les informations fournies
par les agents sur comment chaque nud doit tre configur et lenvoie lagent. Lagent applique le changement
comme prescrit dans le catalogue et renvoie un rapport au Puppet Master.
Facter est un outil intressant qui est livr avec Puppet qui rcupre des facts de base sur le systme. Ces facts peuvent
tre rfrencs comme une variable tout en crivant vos modules Puppet.
$ facter kernel
Linux
$ facter operatingsystem
Ubuntu
Lcriture des modules dans Puppet est assez simple. Les manifestes Puppet forment ensemble les modules Puppet.
Les manifestes Puppet se terminent avec une extension .pp. Voici un exemple de Hello World en Puppet.
Voici un autre exemple avec une logique base sur le systme. Notez comment le fact du systme dexploitation est
utilis comme une variable prfix avec le signe $. De mme, cela vaut pour dautres facts tels que le nom dhte qui
peut tre rfrenc par $hostname
Il existe plusieurs types de ressources pour Puppet, mais le paradigme package-fichier-service est tout ce quil faut pour
entreprendre la majorit de la gestion de la configuration. Le code Puppet suivant sassure que le paquet OpenSSH-
Server est install dans un systme et le service sshd est averti de redmarrer chaque fois que le fichier de configuration
de sshd est modifi.
package { 'openssh-server':
ensure => installed,
}
file { '/etc/ssh/sshd_config':
source => 'puppet:///modules/sshd/sshd_config',
owner => 'root',
service { 'sshd':
ensure => running,
enable => true,
hasstatus => true,
hasrestart=> true,
}
Blueprint
faire
Ecrire propos de Blueprint
Buildout
Buildout est un outil de build logiciel open source. Buildout est cr en utilisant le langage de programmation Python.
Il implmente un principe de sparation de configuration partir des scripts qui font la configuration. Buildout est
principalement utilis pour tlcharger et configurer des dpendances dans le format eggs Python du logiciel en cours
de dveloppement ou dploy. Les recettes pour des tches de build dans tous les environnements peuvent tre crs,
et beaucoup sont dj disponibles.
Buidout est crit en Python.
Intgration continue
Pourquoi ?
Martin Fowler, qui a t le premier crire propos de lintgration continue (Continuous Integration ou CI) avec
Kent Beck, dcrit la CI comme ce qui suit :
Lintgration continue est une pratique de dveloppement logiciel, o les membres dune quipe intgrent
leur travail souvent, habituellement chaque personne intgre au moins quotidiennement - conduisant de
multiples intgrations par jour. Chaque intgration est vrifie par un build automatique (y compris le test)
pour dtecter les erreurs dintgration aussi rapidement que possible. De nombreuses quipes trouvent que
cette approche conduit une rduction significative des problmes dintgration et permet une quipe
de dvelopper des logiciels cohrents plus rapidement.
Jenkins
Buildbot
Buildbot est un systme Python pour automatiser le cycle de compilation/test pour valider les changements de code.
Tox
tox est un outil dautomatisation fournissant le packaging, les tests et le dploiement de logiciels Python directement
depuis la console ou le serveur dintgration continue. Cest un outil en ligne de commande de gestion denvironnement
virtuel virtualenv gnrique et de test qui fournit les fonctionnalits suivantes :
Vrifiant que les paquets sinstallent correctement avec les diffrentes versions de Python et ses diffrents
interprteurs
Excutant des tests dans chacun des environnements, configurant loutil de test de votre choix
Agissant comme un front-end pour les serveurs dintgration continue, rduisant les surcouches et fusionnant
la CI et les tests bass sur le shell.
Travis-CI
Travis-CI est un serveur de CI distribu qui excute des tests pour les projets open source gratuitement. Il fournit
plusieurs workers pour excuter des tests Python sur et sintgre de faon transparente avec GitHub. Vous pouvez
mme faire des commentaires sur vos Pull Requests si ce changeset particulier casse le build ou non. Donc, si vous
hbergez votre code sur GitHub, travis-ci est un bonne et facile manire de commencer avec lintgration continue.
Pour commencer, ajoutez un fichier .travis.yml votre dpt avec cet exemple de contenu :
language: python
python:
- "2.6"
- "2.7"
- "3.2"
- "3.3"
# command to install dependencies
script: python tests/test_all_of_the_units.py
branches:
only:
- master
Cela vous permettre davoir votre projet test sur toutes les versions de Python listes en excutant le script donn, et
ne fera que builder la branche master. Il y a beaucoup plus doptions que vous pouvez activer, comme les notifications,
avant et aprs les tapes et bien plus encore. La documentation de travis-ci explique toutes ces options, et est trs
complte.
Afin dactiver les tests pour votre projet, allez sur le site travis-ci et connectez-vous avec votre compte GitHub. Ensuite,
activez votre projet dans vos paramtres de profil et vous tes bon. A partir de maintenant, les tests de votre projet
seront excuts sur tous les push vers GitHub.
Vitesse
CPython, limplmentation la plus couramment utilise de Python, est lente pour les tches lies au CPU (processeur).
PyPy est rapide.
En utilisant une version lgrement modifie du code de test li au CPU de David Beazleys (boucle ajoute pour de
multiples tests), vous pouvez voir la diffrence entre le traitement CPython et PyPy.
3.10. Vitesse 67
Python Guide Documentation, Version 0.0.1
# PyPy
$ ./pypy -V
Python 2.7.1 (7773f8fc4223, Nov 18 2011, 18:47:10)
[PyPy 1.7.0 with GCC 4.4.3]
$ ./pypy measure2.py
0.0683999061584
0.0483210086823
0.0388588905334
0.0440690517426
0.0695300102234
# CPython
$ ./python -V
Python 2.7.1
$ ./python measure2.py
1.06774401665
1.45412397385
1.51485204697
1.54693889618
1.60109114647
Contexte
Le GIL
The GIL (Global Interpreter Lock) est comment Python permet plusieurs threads de fonctionner en mme temps.
La gestion de la mmoire de Python est pas entirement thread-safe, de sorte que le GIL est requis pour empcher
plusieurs threads dexcuter le mme code Python la fois.
David Beazley a un bon guide sur la manire dont le GIL opre. I lcouvre aussi le new GIL dans Python 3.2. Ses
rsultats montrent que maximiser les performances dans une application Python ncessite une bonne comprhension
de la GIL, comment il affecte votre application spcifique, combien de curs que vous avez, et o sont vos goulots
dtranglement dans lapplication.
Extensions C
Le GIL
Une Special care doit tre prise lors de lcriture dextensions C pour vous assurer que vous enregistrez vos threads
avec linterprteur.
Extensions C
Cython
Cython implmente un sur-ensemble du langage Python avec lequel vous tes en mesure dcrire des modules C et C
++ pour Python. Cython vous permet galement dappeler des fonctions depuis des bibliothques compiles C. Utiliser
Cython vous permet de tirer avantage du typage fort des variables Python et des oprations.
Voici un exemple de typage fort avec Cython :
cdef int n, k, i
cdef int p[1000]
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
Limplmentation dun algorithme pour trouver des nombres premiers a quelques mots-cls supplmentaires par rap-
port la suivante, qui est implmente en pur Python :
def primes(kmax):
"""Calculation of prime numbers in standard Python syntax"""
p = range(1000)
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
Notez que dans la version Cython, vous dclarez les entiers et les tableaux dentiers qui seront compils en types C,
tout en crant aussi une liste Python :
def primes(int kmax):
"""Calculation of prime numbers with additional
Cython keywords"""
cdef int n, k, i
cdef int p[1000]
result = []
def primes(kmax):
"""Calculation of prime numbers in standard Python syntax"""
3.10. Vitesse 69
Python Guide Documentation, Version 0.0.1
p = range(1000)
result = []
Quelle est la diffrence ? Dans la version Cython ci-dessus, vous pouvez voir la dclaration des types de variables et le
tableau entier dune manire similaire celle du standard C. Par exemple cdef int n,k,i dans la ligne 3. Cette dclaration
de type supplmentaire (cest dire entier) permet au compilateur Cython de gnrer du code C plus efficace partir
de la deuxime version. Alors que le code standard de Python est sauv dans des fichiers *.py, le code Cython est
sauv dans des fichiers *.pyx.
Quelle est la diffrence de vitesse ? Essayons !
import time
#activate pyx compiler
import pyximport
pyximport.install()
#primes implemented with Cython
import primesCy
#primes implemented with Python
import primes
print "Cython:"
t1= time.time()
print primesCy.primes(500)
t2= time.time()
print "Cython time: %s" %(t2-t1)
print ""
print "Python"
t1= time.time()
print primes.primes(500)
t2= time.time()
print "Python time: %s" %(t2-t1)
import pyximport
pyximport.install()
Le module pyximport vous permet dimporter les fichiers *.pyx (par exemple, primesCy.pyx) avec la version
compile par Cython de la fonction primes. La commande pyximport.install()permet linterprteur Python de
dmarrer directement le compilateur Cython pour gnrer le code C, qui est automatiquement compil en une bi-
bliothque C :file :*.so. Cython est alors capable dimporter cette bibliothque pour vous dans votre code Python,
facilement et efficacement. Avec la fonction time.time(), vous tes en mesure de comparer le temps entre ces 2 diff-
rents appels pour trouver 500 nombres premiers. Sur un ordinateur portable standard (dual core AMD E-450 1,6 GHz),
les valeurs mesures sont :
Cython time: 0.0054 seconds
Pyrex
Shedskin ?
Numba
faire
crire propos de Numba et du compilateur autojit pour NumPy
Concurrence
Concurrent.futures
Le module concurrent.futures est un module dans la bibliothque standard qui fournit une interface de haut-niveau
pour excuter des callables de manire asynchrone. Il abstrait une grande partie des dtails les plus compliqus
sur lutilisation de plusieurs threads ou processus pour la concurrence, et permet lutilisateur de se concentrer sur
laccomplissement de la tche accomplir.
Le module concurrent.futures expose deux classes principales, ThreadPoolExecutor et ProcessPoolExecutor. Le
ThreadPoolExecutor va crer un pool de worker threads auquel un utilisateur peut soumettre des jobs faire. Ces
jobs seront ensuite excuts dans un autre thread quand le prochain worker thread va devenir disponible.
Le ProcessPoolExecutor fonctionne de la mme manire, sauf au lieu dutiliser plusieurs threads pour ses workers, elle
utilisera de multiples processus. Cela permet de mettre de ct le GIL, cependant cause de la faon dont les choses
sont passes des processus workers, seuls les objets picklables peuvent tre excuts et retourns.
En raison de la manire dont le GIL fonctionne, une bonne rgle de base est dutiliser une ThreadPoolExecutor lorsque
la tche en cours dexcution implique beaucoup de blocage ( savoir faire des requtes sur le rseau) et dutiliser un
excuteur ProcessPoolExecutor lorsque la tche est informatiquement coteuse.
Il existe deux principales manires dexcuter des choses en parallle en utilisant les deux excuteurs. Une faon est
avec la mthode map(func, iterables). Cela fonctionne presque exactement comme la fonction intgre map(), sauf
quil excutera tout en parallle. :
def get_webpage(url):
page = requests.get(url)
return page
pool = ThreadPoolExecutor(max_workers=5)
Pour encore plus de contrle, la mthode submit(func, *args, **kwargs) programmera quun callable soit excut (
comme func(*args, **kwargs)) et retourne un objet Future qui reprsente lexcution du callable.
Lobjet Future fournit diverses mthodes qui peuvent tre utilises pour vrifier ltat davancement du callable pro-
gramm. Cela inclut :
3.10. Vitesse 71
Python Guide Documentation, Version 0.0.1
def is_prime(n):
if n % 2 == 0:
return n, False
sqrt_n = int(n**0.5)
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return n, False
return n, True
PRIMES = [
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419]
futures = []
with ProcessPoolExecutor(max_workers=4) as pool:
# Schedule the ProcessPoolExecutor to check if a number is prime
# and add the returned Future to our list of futures
for p in PRIMES:
fut = pool.submit(is_prime, p)
futures.append(fut)
Le module concurrent.futures contient deux helpers pour travailler avec Futures. La fonction as_completed(futures)
retourne un itrateur sur la liste des futures, en faisant un yield des futures jusqu ce quelles soient compltes.
La fonction wait(futures) va tout simplement bloquer jusqu ce que toutes les futures dans la liste des futures soient
termines.
Pour plus dinformations, sur lutilisation du module concurrent.futures, consulter la documentation officielle.
Threading
La bibliothque standard est livr avec un module threading qui permet un utilisateur de travailler avec plusieurs
threads manuellement.
Excuter une fonction dans un autre thread est aussi simple que de passer un callable et ses arguments constructeur du
Thread et dappeler ensuite start() :
def get_webpage(url):
page = requests.get(url)
return page
Aprs lappel du join(), cest toujours une bonne ide de vrifier si le thread est toujours en vie (parce que lappel join
a expir) :
if some_thread.is_alive():
print("join() must have timed out.")
else:
print("Our thread has terminated.")
Parce que plusieurs threads ont accs la mme section de la mmoire, parfois il peut y avoir des situations o deux
ou plusieurs threads tentent dcrire sur la mme ressource en mme temps ou lorsque la sortie est dpendante de
la squence ou du timing de certains vnements. Ceci est appel une data race ou race condition. Lorsque cela
se produit, la sortie sera dnature ou vous pouvez rencontrer des problmes qui sont difficiles dbuguer. Un bon
exemple est ce stackoverflow post.
La faon dont cela peut tre vit est dutiliser un Lock_ que chaque thread aura besoin dacqurir avant dcrire dans
une ressource partage. Les locks peuvent tre acquis et librs soit par le protocole de contextmanager (dclaration
with), ou en utilisant acquire() et release() directement. Voici un exemple (plutt artificiel) :
file_lock = Lock()
def log(msg):
with file_lock:
open('website_changes.log', 'w') as f:
f.write(changes)
def monitor_website(some_website):
"""
Monitor a website and then if there are any changes,
log them to disk.
"""
while True:
changes = check_for_changes(some_website)
if changes:
log(changes)
3.10. Vitesse 73
Python Guide Documentation, Version 0.0.1
Ici, nous avons un tas de threads vrifiant des changements sur une liste de sites et chaque fois quil y a des chan-
gements, ils tentent dcrire ces modifications dans un fichier en appelant log(changes). Lorsque log() est appel, il
attendra dacqurir le lock avec avec file_lock :. Cela garantit qu tout moment, seulement un seul thread est en train
dcrire dans le fichier.
Processus de spawning
Multiprocessing
Applications scientifiques
Contexte
Python est frquemment utilis pour des applications scientifiques haute-performances. Il est largement utilis dans
les projets universitaires et scientifiques car il est facile crire et donne de bons rsultats.
En raison de sa nature haute performance, le calcul scientifique en Python utilise souvent des bibliothques externes,
gnralement crites dans des langages plus rapides (comme C ou FORTRAN pour les oprations matricielles). Les
principales bibliothques utilises sont NumPy, SciPy et Matplotlib. Entrer dans le dtail de ces bibliothques va
au-del du primtre couvert par ce guide Python. Cependant, une introduction complte lcosystme Python scien-
tifique peut tre trouve dans les notes de lecture pour le Python scientifique (en)
Outils
IPython
IPython est une version amliore de linterprteur Python, qui fournit des fonctionnalits dun grand intrt pour les
scientifiques. Le mode inline permet laffichage de graphiques et de diagrammes dans le terminal (pour la version
base sur Qt). De plus, le mode notebook supporte la programmation lettre et la science reproductible en gnrant un
notebook Python bas sur le Web. Ce notebook vous permet de stocker des bouts de code Python ct des rsultats et
des commentaires supplmentaires (HTML, LaTeX, Markdown). Le notebook peut alors tre partag et export dans
divers formats de fichiers.
Bibliothques
NumPy
NumPy est une bibliothque de bas niveau crite en C (et FORTRAN) pour les fonctions mathmatiques de haut
niveau. NumPy dpasse habilement le problme dexcuter des algorithmes plus lents sur Python en utilisant des
tableaux multidimensionnels et des fonctions qui oprent sur des tableaux. Tout algorithme peut alors tre exprim
comme une fonction sur des tableaux, permettant aux algorithmes de excuter rapidement.
NumPy fait partie du projet SciPy, et est mis disposition comme bibliothque spare afin que les gens qui ont
seulement besoin des exigences de base puissent lutiliser sans installer le reste de SciPy.
NumPy est compatible avec les versions de Python 2.4 2.7.2 et 3.1+.
Numba
Numba est un compilateur Python conscient de NumPy (compilateur spcialis just-in-time (JIT)) qui compile le code
Python (et NumPy) annot pour LLVM (Low Level Virtual Machine) via des dcorateurs spciaux. En bref, Numba
utilise un systme qui compile le code Python avec LLVM en code qui peut tre excut nativement lexcution.
SciPy
SciPy est une bibliothque qui utilise NumPy pour plus de fonctions mathmatiques. SciPy utilise des tableaux numpy
comme structure de base pour les donnes, et est livr avec des modules pour diverses tches couramment utilises
dans la programmation scientifique, incluant lalgbre linaire, le calcul intgral (calcul diffrentiel), la rsolution
dquation diffrentielle ordinaire et le traitement du signal.
Matplotlib
Matplotlib est une bibliothque de cration de diagrammes flexible pour crer des diagrammes 2D et 3D interactifs
qui peuvent galement tre enregistrs comme des figures dune qualit suffisante pour illustrer des manuscrits. LAPI
reflte de plusieurs faons celle de MATLAB, facilitant la transition des utilisateurs MATLAB Python. De nombreux
exemples, avec le code source pour les recrer, sont disponibles dans la galerie de matplotlib.
Pandas
Pandas est une bibliothque de manipulation de donnes base sur Numpy qui fournit de nombreuses fonctions utiles
pour accder, indexer, fusionner et le regrouper des donnes facilement. La structure de donnes principale (Data-
Frame) est proche de ce qui peut tre trouv dans le paquet statistique R ; autrement dit, des tableaux de donnes
htrognes avec lindexation par nom, les oprations sur les sries temporelles et lauto-alignement des donnes.
Rpy2
Rpy2 est le binding Python pour le logiciel statistique R permettant lexcution de fonctions de R depuis Python et
transmettant les donnes dans les deux sens entre les deux environnements. Rpy2 est limplmentation oriente objet
des bindings Rpy.
PsychoPy
PsychoPy est une bibliothque pour la psychologie cognitive et lex exprimentations en neuroscience. La bibliothque
gre la prsentation des stimuli, le scripting de conception exprimentale et la collecte de donnes.
Ressources
Linstallation de paquets Python scientifiques peut tre complique, comme beaucoup de ces paquets sont mis en uvre
comme des extensions Python en C qui doivent tre compiles. Cette section liste les diffrentes distributions Python
dites scientifiques qui fournissent des collections prcompiles et faciles installer de paquets Python scientifiques.
Beaucoup de gens qui font le calcul scientifique sont sous Windows, et encore beaucoup de paquets de calcul scien-
tifique sont notoirement difficiles builder et installer sur cette plateforme. Christoph Gohlke cependant, a compil
une liste de binaires Windows pour de nombreux paquets Python utiles. La liste des paquets a grossi en devenant une
ressource Python principalement scientifique une liste plus gnrale. Si vous tes sur Windows, vous pouvez y jeter
un il.
Anaconda
Continuum Analytics met disposition la distribution Python Anaconda Python qui inclue tous les paquets Python
scientifiques les plus courants, ainsi que de nombreux paquets lis lanalyse de donnes et au big data. Anaconda
lui-mme est gratuit, et Continuum vend un certain nombre dadd-ons propritaires. Des licences gratuites pour ces
add-ons sont disponibles pour les universitaires et les chercheurs.
Canopy
Canopy est une autre distribution de Python scientifique, produit par Enthought. Une variante limite Canopy Ex-
press est disponible gratuitement, mais Enthought facture pour la distribution complte. Des licences gratuites sont
disponibles pour les universitaires.
Manipulation dimages
La plupart des techniques de traitement et de manipulation dimages peuvent tre effectues efficacement en utilisant
deux bibliothques : Python Imaging Library (PIL) et Open Source Computer Vision (OpenCV).
Une brve description des deux est donne ci-dessous.
La Python Imaging Library, ou PIL, est lune des bibliothques de base pour la manipulation dimages en Python.
Malheureusement, son dveloppement a stagn, avec sa dernire version en 2009.
Heureusement pour vous, il y a un fork dvelopp activement de PIL appel Pillow - il est plus facile installer,
fonctionne sur tous les systmes dexploitation, et supporte Python 3.
Installation
Avant dinstaller Pillow, vous devrez installer les prrequis pour Pillow. Vous trouverez les instructions de votre plate-
forme dans les instructions dinstallation de Pillow.
Aprs cela, cest direct :
Exemple
#Splitting the image into its respective bands, i.e. Red, Green,
#and Blue for RGB
r,g,b = im_sharp.split()
OpenSource Computer Vision, plus connu comme OpenCV, est un logiciel plus avanc de manipulation et de traite-
ment dimages que PIL. Il a t implment en plusieurs langages et est largement utilis.
Installation
En Python, le traitement dimage en utilisant OpenCV est implment en utilisant les modules cv2 et NumPy. Les
instructions dinstallation pour OpenCV devrait vous guider dans la configuration du projet pour vous-mme.
NumPy peut tre tlcharg partir du Python Package Index (PyPI) :
Exemple
Srialisation de donnes
La srialisation de donnes est le concept de conversion de donnes structures dans un format qui lui permet dtre
partag ou stock de manire ce que sa structure dorigine puisse tre rcupre. Dans certains cas, lintention
secondaire de srialisation de donnes est de minimiser la taille des donnes srialis, ce qui minimise alors les
exigences despace disque ou de bande passante.
Pickle
import pickle
Protobuf
Si vous tes la recherche dun module de srialisation qui supporte plusieurs langages, la bibliothque de Google
Protobuf est une option.
Parsage XML
untangle
untangle est une bibliothque simple qui prend un document XML et retourne un objet Python qui reflte les nuds et
les attributs dans sa structure.
Par exemple, un fichier XML comme ceci :
<?xml version="1.0"?>
<root>
<child name="child1">
</root>
import untangle
obj = untangle.parse('path/to/file.xml')
et ensuite vous pouvez obtenir le nom des lments fils comme ceci :
obj.root.child['name']
untangle supporte aussi le chargement de XML depuis une chane de caractres ou une URL.
xmltodict
xmltodict est une autre bibliothque simple qui vise faire que le XML donne limpression de travailler avec JSON
Un fichier XML comme ceci :
<mydocument has="an attribute">
<and>
<many>elements</many>
<many>more elements</many>
</and>
<plus a="complex">
element as well
</plus>
</mydocument>
import xmltodict
et ensuite, vous pouvez accder aux lments, attributs et valeurs comme ceci :
doc['mydocument']['@has'] # == u'an attribute'
doc['mydocument']['and']['many'] # == [u'elements', u'more elements']
doc['mydocument']['plus']['@a'] # == u'complex'
doc['mydocument']['plus']['#text'] # == u'element as well'
xmltodict vous permet aussi des aller-retours au XML avec la fonction unparse, dispose dun mode streaming adapt
la manipulation des fichiers qui ne rentrent pas en mmoire et supporte les espaces de noms.
JSON
La bibliothque json peut parser un JSON depuis des chanes de caractres ou des fichiers. La bibliothque parse le
JSON en un dictionnaire ou une liste Python. Elle peut galement convertir les dictionnaires Python ou des listes en
chanes JSON.
Parsage de JSON
import json
parsed_json = json.loads(json_string)
3.15. JSON 79
Python Guide Documentation, Version 0.0.1
print(parsed_json['first_name'])
"Guido"
print(json.dumps(d))
'{"first_name": "Guido", "last_name": "Rossum", "titles": ["BDFL", "Developer"]}'
simplejson
La bibliothque JSON a t ajoute Python dans la version 2.6. Si vous utilisez une version antrieure de Python, la
bibliothque simplejson est disponible via PyPI.
simplejson imite la bibliothque standard json. Il est disponible pour que les dveloppeurs qui utilisent danciennes
versions de Python puissent utiliser les dernires fonctionnalits disponibles dans la bibliothque json.
Vous pouvez commencer utiliser simplejson lorsque la bibliothque json nest pas disponible par limportation de
simplejson sous un autre nom :
Aprs limportation de simplejson comme json, les exemples ci-dessus fonctionneront tous comme si vous utilisiez la
bibliothque json standard.
Cryptography
Cryptography
Cryptography est une bibliothque dveloppe activement qui fournit des recettes et des primitives cryptographiques.
Elle supporte Python 2,6-2,7, Python 3.3+ et PyPy.
Cryptography est divis en deux couches : recettes et matires dangereuses (hazardous material ou hazmat). La
couche de recettes fournit une API simple pour un chiffrement symtrique correct et la couche hazmat fournit des
primitives cryptographiques de bas niveau.
Installation
Exemple
PyCrypto
PyCrypto est une autre bibliothque, qui fournit des fonctions de hash scurises et diffrents algorithmes de chiffre-
ment. Elle supporte Python version 2.1 3.3.
Installation
Exemple
# Decryption
decryption_suite = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
plain_text = decryption_suite.decrypt(cipher_text)
CFFI fournit un mcanisme simple utiliser pour linterfaage avec C la fois depuis CPython et PyPy. Il prend en
charge deux modes : un mode de compatibilit ABI inline (exemple ci-dessous), ce qui vous permet de charger et
excuter dynamiquement des fonctions depuis des modules excutables (exposant essentiellement les mmes fonc-
tionnalits que LoadLibrary ou dlopen), et un mode API, qui vous permet de construire des modules dextension
C.
ctypes
ctypes est la bibliothque de fait pour linterfaage avec C/C ++ depuis CPython, et il fournit non seulement un accs
complet linterface C native de la plupart des principaux systmes dexploitation (par exemple, kernel32 sur Win-
dows, ou libc sur *nix), mais fournit galement le support pour le chargement et linterfaage avec des bibliothques
dynamiques, telles que les DLL ou les objets partags (Shared Objects ou SO) lors de lexcution. Il embarque avec lui
toute une srie de types pour interagir avec les APIs systme, et vous permet de dfinir assez facilement vos propres
types complexes, tels que les structs et les unions, et vous permet de modifier des choses telles que le padding et
lalignement, si ncessaire. Il peut tre un peu retors utiliser, mais conjointement avec le module struct, vous recevez
essentiellement un contrle complet sur la faon dont vos types de donnes sont traduits en quelque chose dutilisable
par une mthode C(++) pure.
quivalents de struct
MyStruct.h
1 struct my_struct {
2 int a;
3 int b;
4 };
MyStruct.py
1 import ctypes
2 class my_struct(ctypes.Structure):
3 _fields_ = [("a", c_int),
4 ("b", c_int)]
SWIG
SWIG, bien que pas strictement orient Python (il prend en charge un grand nombre de langages de scripting), est un
outil pour gnrer des bindings pour les langages interprts partir des fichiers den-tte C/C++. Il est extrmement
simple de lutiliser : le consommateur doit simplement dfinir un fichier dinterface (dtaille dans le tutoriel et la
documentation), inclure les en-ttes C/C ++ ncessaires, et excuter loutil de build sur eux. Alors quil a quelques
limites, (il semble actuellement avoir des problmes avec un petit sous-ensemble de nouvelles fonctionnalits C++, et
avoir du code avec des templates partout pour travailler peut tre un peu verbeux), il est trs puissant et expose beau-
coup de fonctionnalits pour Python avec peu deffort. En outre, vous pouvez facilement tendre les bindings SWIG
crs (dans le fichier dinterface) pour surcharger les oprateurs et les mthodes intgres, recaster les exceptions C++
pour tre capturables par Python, etc.
MyClass.h
1 #include <string>
2 class MyClass {
3 private:
4 std::string name;
5 public:
6 std::string getName();
7 };
myclass.i
1 %include "string.i"
2
3 %module myclass
4 %{
5 #include <string>
6 #include "MyClass.h"
7 %}
8
9 %extend MyClass {
10 std::string __repr__()
11 {
12 return $self->getName();
13 }
14 }
15
16 %include "MyClass.h"
Boost.Python
Boost.Python ncessite un peu plus de travail manuel pour exposer la fonctionnalit dun objet C++, mais il est capable
de fournir tous les fonctionnalits que SWIG fournit, et quelques unes pour inclure des wrappers pour accder des
objets Python en C ++, en extrayant des objets wrapps SWIG-, et mme permettant dincorporer des morceaux de
Python dans votre code C++.
Packagez votre code pour le partager avec dautres dveloppeurs. Par exemple, pour partager une bibliothque pour
que dautres dveloppeurs lutilise dans leur application, ou pour les outils de dveloppement comme py.test.
Un avantage de cette mthode de distribution est son cosystme bien tabli doutils tels que PyPI et pip, qui rendent
facile pour dautres dveloppeurs de tlcharger et dinstaller votre paquet soit pour des exprimentations occasion-
nelles, ou comme un morceau de grands systmes professionnels.
Cest une convention bien tablie pour le code Python dtre partag de cette faon. Si votre code nest pas packag
sur PyPI, alors il sera plus difficile pour les autres dveloppeurs de le trouver, et de lutiliser dans le cadre de leur
processus existant. Ils vont considrer de tels projets avec la suspicion importante quil soit mal gr ou abandonn.
Linconvnient de la distribution de code comme ceci est quil repose sur le fait que le destinataire comprenne comment
installer la version requise de Python, et soit en mesure et dsireux dutiliser des outils tels que pip pour installer les
autres dpendances de votre code. Cest bien quand la distribution est pour les autres dveloppeurs, mais rend cette
mthode inadapte pour la distribution dapplications des utilisateurs finaux.
Le Python Packaging Guide fournit un guide complet sur la cration et la maintenance des paquets Python.
Alternatives au packaging
Pour distribuer des applications des utilisateurs finaux, vous devriez geler votre application.
Sous Linux, vous pouvez galement envisager de crer un paquet de distribution Linux (cest dire des fichiers .deb
pour Debian ou Ubuntu.)
Si vous crivez un module Python open source, PyPI , plus connu comme le Cheeseshop (magasin de fromages), est
lemplacement o lhberger.
85
Python Guide Documentation, Version 0.0.1
PyPi personnel
Si vous voulez installer des paquets partir dune autre source que PyPI, (par exemple, si vos paquets sont propri-
taires), vous pouvez le faire hbergeant un simple serveur http, sexcutant partir du rpertoire qui contient les
paquets qui doivent tre installs.
Montrer un exemple est toujours bnfique
Par exemple, si vous souhaitez installer un paquet appel MyPackage.tar.gz, et en supposant que cest votre
structure de rpertoire :
archive
MyPackage
MyPackage.tar.gz
Allez votre invite de commande et tapez :
$ cd archive
$ python -m SimpleHTTPServer 9000
Cela excute un simple serveur http, fonctionnant sur le port 9000 et listera tous les paquets (comme MyPackage).
Maintenant, vous pouvez installer MyPackage en utilisant nimporte quel installateur de paquets Python. En utilisant
Pip, vous devriez le faire avec :
Avoir un dossier avec le mme nom que le nom du package est cruciale ici. Jai t tromp par cela, une seule fois.
Mais si vous avez limpression que crer un dossier appel MyPackage et garder un fichier MyPackage.tar.gz
dedans est redondant, vous pouvez toujours installer MyPackage en utilisant :
pypiserver
Pypiserver est un serveur minimal compatible avec PyPi. Il peut tre utilis pour servir un jeu de paquets pour
easy_install ou pip. Il inclue des fonctionnalits utiles comme une commande administrative (-U) qui mettra jour
tous ses paquets leurs dernires versions trouves sur PyPI.
Une option simple pour un serveur PyPI personnel est dutiliser Amazon S3. Un prrequis pour cela est que vous ayez
un compte Amazon AWS avec un bucket S3.
1. Installer tous vos requirements depuis PyPi ou une autre source
2. Installer pip2pi
pip install git+https://github.com/wolever/pip2pi.git
Assurez-vous que vous uploadez packages/simple/index.html ainsi que tous les nouveaux fichiers
et rpertoires.
6. Termin
Vous pouvez maintenant installer votre paquet avec pip install
--index-url=http://your-s3-bucket/packages/simple/ MyPackage
Crer un paquet pour distribution Linux est sans doute la bonne manire de distribuer votre code sous Linux.
Parce quun paquet de distribution ninclue pas linterprteur Python, il rend le tlchargement et linstallation environ
2MB plus petit que le gel de votre application.
En outre, si une distribution met disposition une nouvelle mise jour de scurit pour Python, votre application
commencera automatiquement utiliser cette nouvelle version de Python.
La commande bdist_rpm rend triviale la production dun fichier RPM pour lutilisation par des distributions comme
Red Hat ou SuSE.
Cependant, crer et maintenir les diffrentes configurations requises pour chaque format de distribution (par exemple
.deb pour Debian/Ubuntu, .rpm pour Red Hat/Fedora, etc) est une bonne quantit de travail. Si votre code est une
application que vous envisagez de distribuer sur dautres plates-formes, alors vous aurez galement crer et maintenir
la configuration spare ncessaire pour geler votre application pour Windows et OSX. Ce serait beaucoup moins de
travail de simplement crer et maintenir une seule configuration pour un des outils de freezing multi-plateformes, qui
va produire des excutables autonomes pour toutes les distributions de Linux, ainsi que Windows et OSX.
Crer un paquet de distribution est galement problmatique si votre code est pour une version de Python qui nest
pas supporte par une distribution. Avoir dire des utilisateurs finaux de certaines versions dUbuntu quils ont
besoin dajouter le PPA dead-snakes en utilisant la commande sudo apt-repository avant de pouvoir installer votre
fichier .deb rend lexprience hostile lutilisateur. Non seulement cela, mais vous auriez maintenir un quivalent
personnalis de ces instructions pour chaque distribution, et pire encore, demander vos utilisateurs de lire, de
comprendre et dagir sur eux.
Cela dit, voici comment faire :
Fedora
Debian et Ubuntu
Arch
Outils utiles
fpm
alien
Geler (Freezing) votre code cest crer un excutable avec un seul fichier distribuer aux utilisateurs finaux, qui
contient tout le code de lapplication ainsi que linterprteur Python.
Les appplications comme Dropbox, Eve Online, Civilisation IV, et des clients BitTorrent font cela.
Lavantage de la distribution de cette faon est que votre application va juste marcher, mme si lutilisateur na
pas dj la version requise de Python (ou aucune) installe. Sous Windows, et mme sur de nombreuses distributions
Linux et OS X, la bonne version de Python ne sera pas dj install.
En outre, le logiciel utilisateur final doit toujours tre dans un format excutable. Les fichiers se terminant par .py
sont pour les ingnieurs logiciels et les administrateurs systme.
Un inconvnient du freezing est quil augmentera la taille de votre distribution denviron 2 12MB. En outre, vous
serez responsable de dlivrer des versions mises jour de votre application lorsque des failles de scurit Python sont
patches.
Alternatives au Freezing
Packager votre code est pour la distribution des bibliothques ou doutils pour dautres dveloppeurs.
Sous Linux, une alternative au freezing est de crer un paquet de distribution Linux (cest dire des fichiers .deb pour
Debian ou Ubuntu, ou des fichiers .rpm pour Red Hat et SuSE.)
faire
Complter le stub Geler votre code
Note : Geler du code Python sous Linux dans un excutable Windows a un jour t support dans PyInstaller et
ensuite t supprim..
Note : Toutes les solutions ncessitent que les dll MS Visual C++ soient installes sur la machine cible, ex-
cept py2app. Seul Pyinstaller fait des .exe auto-excutables qui embarque les dll quand on passe --onefile
Configure.py.
Windows
bbFreeze
faire
crire les tapes pour les excutables les basiques
py2exe
setup(
windows=[{'script': 'foobar.py'}],
)
6. Fournissez les DLL du runtime Microsoft Visual C++. Deux options : installer globalement les dll sur ma
machine cible ou distribuer les dll ct du .exe.
PyInstaller
Le prrequis est davoir install Python, Setuptools et la dpendance pywin32 sous Windows.
Tutoriel le plus basique
Manuel
OS X
py2app
PyInstaller
PyInstaller peut tre utilis pour construire des excutables Unix et applications fentres sur Mac OS X 10.6 (Snow
Leopard) ou plus rcent.
Pour installer PyInstaller, utilisez pip :
$ pyinstaller script.py
cela cr,
un fichier script.spec, analogue un fichier make
un dossier build, qui contient quelques fichiers de log
un dossier dist, qui contient lexcutable principal script, et quelques bibliothques Python dpendantes,
toutes dans le mme dossier que script.py. PyInstaller met toutes les bibliothques Python utilises dans
script.py dans le dossier dist. Donc lors de la distribution de lexcutable, distribuez lensemble du dossier
dist.
Le fichier script.spec peut tre dit pour customiser le build, avec des options comme
Embarquer les fichiers de donnes avec lexcutable
y compris les bibliothques de run-time (fichiers .dll ou .so) que PyInstaller ne peut pas dduire automati-
quement
ajout des options du run-time Python lexcutable,
Maintenant script.spec peut tre excuter avec pyinstaller (plutt que dutiliser encore script.py) :
$ pyinstaller script.spec
Cela cr script.app dans le dossier dist. Assurez-vous dutiliser des paquets graphiques dans votre code Py-
thon, comme PyQt ou PySide, pour contrler les parties graphiques de votre application.
Il y a plusieurs option script.spec lies lencapsulation dapplications Mac OS X ici. Par exemple, pour spcifier
une icne pour lapplication, utilisez loption icon=\path\to\icon.icns.
Linux
bbFreeze
PyInstaller
Cette partie du guide se concentre sur lenvironnement de dveloppement Python et les outils pour les meilleures
pratiques qui sont disponibles pour crire du code Python.
diteurs de texte
Tout ce qui peut diter du texte brut peut fonctionner pour lcriture de code Python. Cependant, utiliser un diteur
plus puissant peut vous rendre la vie un peu plus facile.
Vim
Vim est un diteur de texte qui utilise des raccourcis clavier pour diter au lieu de menus ou dicnes. Il y a des couples
plugins et paramtres pour lditeur Vim pour faciliter le dveloppement Python. Si vous dveloppez seulement en
Python, un bon point de dpart est de dfinir les paramtres par dfaut pour lindentation et les valeurs pour les retours
la ligne conformes PEP 8. Dans votre rpertoire home, ouvrez un fichier appel .vimrc et ajoutez les lignes
suivantes :
set textwidth=79 " lines longer than 79 columns will be broken
set shiftwidth=4 " operation >> indents 4 columns; << unindents 4 columns
set tabstop=4 " a hard TAB displays as 4 columns
set expandtab " insert spaces when hitting TABs
set softtabstop=4 " insert/delete 4 spaces when hitting a TAB/BACKSPACE
set shiftround " round indent to multiple of 'shiftwidth'
set autoindent " align the new line indent with the previous line
Avec ces configurations, des retours la ligne sont insrs aprs 79 caractres et lindentation est dfinie 4 espaces
par tabulation. Si vous utilisez Vim pour dautres langages, il y a un plugin pratique appel indent, qui peut grer la
configuration de lindentation des fichiers source Python.
Il y a aussi un plugin de syntaxe pratique appele syntax avec quelques amliorations par rapport au fichier de syntaxe
inclus dans Vim 6.1.
Ces plugins vous fournissent un environnement de base pour le dveloppement en Python. Pour tirer le meilleur parti
de Vim, vous devriez vrifier en continu votre code pour les erreurs de syntaxe et la conformit PEP8. Heureusement,
PEP8 and Pyflakes vont le faire pour vous. Si votre Vim est compil avec +python, vous pouvez galement utiliser
certains plugins trs pratiques pour faire ces vrifications depuis lditeur.
91
Python Guide Documentation, Version 0.0.1
Pour vrification PEP8 et pyflakes, vous pouvez installer vim-flake8. Maintenant, vous pouvez mapper la fonction
Flake8 tout raccourci clavier ou de action que vous voulez dans Vim. Le plugin affichera les erreurs au bas de
lcran, et fournira un moyen facile de sauter la ligne correspondante. Il est trs pratique dappeler cette fonction
chaque fois que vous enregistrez un fichier. Pour ce faire, ajoutez la ligne suivante votre .vimrc :
autocmd BufWritePost *.py call Flake8()
Si vous utilisez dj syntastic, vous pouvez le configurer pour excuter Pyflakes lcriture et montrer les erreurs
et avertissements dans la fentre de correction rapide. Un exemple de configuration pour faire cela et qui montre
galement le statut et les messages dalerte dans la barre dtat serait
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_auto_loc_list=1
let g:syntastic_loc_list_height=5
Python-mode
Python-mode est une solution complexe pour travailler avec du code Python dans Vim. Il a :
Vrification de code Python asynchrone (pylint, pyflakes, pep8, mccabe) avec nimporte quelle com-
binaison
Refactoring de code et autocompltion avec Rope
Dpliage de code Python rapide
Support de virtualenv
Recherche dans la documentation Python et excution de code Python
Correction automatiques des erreurs PEP8
Et plus.
SuperTab
SuperTab est un petit plugin Vim qui rend la compltion de code plus pratique en utilisant la touche <Tab> (tabulation)
ou nimporte quelles autres touches personnalises.
Emacs
Emacs est un autre diteur de texte puissant. Il est entirement programmable (Lisp), mais il peut ncessiter un peu de
travail pour tre correctement configurer. Un bon dbut si vous tes dj un utilisateur Emacs est Python Programming
in Emacs sur EmacsWiki.
1. Emacs lui-mme contient un mode pour Python.
TextMate
TextMate apporte lapproche dApple aux systmes dexploitation dans le monde des diteurs de texte. En
tablissant un pont entre les fondements UNIX et les interfaces graphiques,TextMate choisit le meilleur
des deux mondes au bnfice aussi bien des scripteurs experts que des utilisateurs novices.
Sublime Text
Sublime Text est un diteur de texte raffin pour le code, le balisage et la prose. Vous allez adorer linter-
face utilisateur agrable, les fonctionnalits extraordinaires et les performances incroyables.
Sublime Text offre un excellent support pour ldition du code Python et utilise Python pour son API de plugin. Il a
galement une grande diversit de plugins, certains permettent une vrification PEP8 dans lditeur et le linting de
code.
Atom
Atom est un diteur de texte hackable pour le 21e sicle, construit sur atom-shell et sur la base de tout ce
que nous aimons dans nos diteurs favoris.
Atom est bas sur le web (HTML, CSS, JS), en se concentrant sur une conception modulaire et le dveloppement de
plugin facile. Il est livr avec un gestionnaire de paquets natif et une plthore de paquets. Il est recommand pour le
dveloppement Python dutiliser Linter combin avec linter-flake8.
IDEs
PyCharm est dvelopp par JetBrains, aussi connu pour IntelliJ IDEA. Les deux partagent la mme base de code et
la plupart des fonctionnalits de PyCharm peuvent tre accessibles dans IntelliJ avec le Plug-in Python gratuit. Il y a
deux versions de PyCharm : une dition Professionnel (avec 30 jours dessai gratuits) et une dition Communautaire
(sous licence Apache 2.0) avec moins de fonctionnalits.
Enthought Canopy
Enthought Canopy est un IDE Python qui est ax vers les scientifiques et les ingnieurs car il fournit des bibliothques
pr-installes pour lanalyse de donnes.
Eclipse
Le plugin Eclipse le plus populaire pour le dveloppement Python est PyDev de Aptana.
Komodo IDE
Komodo IDE est dvelopp par ActiveState et est un IDE commercial pour Windows, Mac et Linux. KomodoEdit est
lalternative open source.
Spyder
Spyder est un IDE spcifiquement orient vers lutilisation de bibliothques Python scientifiques (notamment Scipy).
Il inclut lintgration avec pyflakes, pylint et rope.
Spyder est open-source (libre), offre la compltion de code, la coloration syntaxique, un navigateur de classes et de
fonctions et linspection dobjets.
WingIDE
WingIDE est un IDE spcifique Python. Il fonctionne sur Linux, Windows et Mac (comme application X11, ce qui
frustre certains utilisateurs de Mac).
WingIDE offre la compltion de code, la coloration syntaxique, la navigation de sources, le dbogueur graphique et le
support pour les systmes de gestion de version.
NINJA-IDE
NINJA-IDE (depuis lacronyme rcursif : Ninja-IDE Is Not Just Another IDE) est un IDE multi-plateformes, sp-
cialement conu pour crer des applications Python, et qui fonctionne sous les systmes dexploitation de bureau
Linux/X11, Mac OS X et Windows. Les installateurs pour ces plates-formes peuvent tre tlchargs partir du site
web.
NINJA-IDE est un logiciel open-source (licence GPLv3) et est dvelopp en Python et Qt. Les fichiers source peuvent
tre tlchargs depuis GitHub.
Eric est un IDE Python trs complet offrant lautocompltion du code source, la coloration syntaxique, le support des
systmes de gestion de version, le support Python 3, un navigateur Web intgr, un shell python, un dbogueur intgr
et un systme de plug-in flexible. crit en Python, il est bas sur la bote outils graphique Qt, intgrant le contrle de
lditeur Scintilla. Eric est un projet de logiciel open-source (licence GPLv3) avec plus de dix ans de dveloppement
actif.
Environnements virtuels
Les environnements virtuels fournissent un moyen puissant pour isoler les dpendances de paquets dun projet. Cela
signifie que vous pouvez utiliser des paquets particuliers un projet Python sans les installer sur lensemble du systme
et ainsi en vitant ainsi la les conflits de version potentiels.
Pour commencer lutiliser et plus dinformations : documents sur les environnements virtuels.
pyenv
pyenv est un outil pour autoriser linstallation de plusieurs versions de linterprteur Python en mme temps. Cela
rsout le problme davoir diffrents projets ncessitant diffrentes versions de Python. Par exemple, il devient trs
facile dinstaller Python 2.7 pour la compatibilit dans un projet, tout en utilisant Python 3.4 comme linterprteur par
dfaut. pyenv nest pas limit aux versions CPython - installera galement les interprteurs PyPy, anaconda, miniconda,
Stackless, Jython et IronPython.
pyenv fonctionne en remplissant un rpertoire shims avec des fausses versions de linterprteur Python (plus dautres
outils comme pip et 2to3). Quand le systme recherche un programme nomm python, il regarde en premier
dans le rpertoire shims, et utilise la fausse version, qui son tour transmet la commande pyenv. pyenv en-
suite dtermine quelle version de Python doit tre excute en fonction des variables denvironnement, de fichiers
.python-version et de lenvironnement global par dfaut.
pyenv nest pas un outil pour la gestion des environnements virtuels, mais il y a le plugin pyenv-virtualenv qui au-
tomatise la cration de diffrents environnements, et permet galement de utiliser les outils de pyenv existants pour
passer des diffrents environnements partir de variables denvironnement ou de fichiers .python-version.
Autres outils
IDLE
IDLE est un environnement de dveloppement intgr (IDE) qui fait partie de la bibliothque Python standard. Il
est entirement crit en Python et utilise la bote outils graphique Tkinter. Bien IDLE ne convienne pas pour le
dveloppement part entire en utilisant Python, il est trs utile pour essayer de petits bouts de code Python et
exprimenter avec les diffrentes fonctionnalits en Python.
Il fournit les fonctionnalits suivantes :
Fentre du shell Python (interprteur)
diteur de texte multi-fentres qui colorie le code Python
Facilit de dbugage minimale
IPython
IPython fournit une bote outils riche pour vous aider tirer le meilleur parti de linteractivit de Python. Ses
principales composants sont :
Shells Python puissants (bass sur le terminal et Qt)
Un notebook bas sur le Web avec les mmes caractristiques de base, mais le support de mdias riches, du
texte, du code, des expressions mathmatiques et des graphiques intgrs inline.
Support pour la visualisation interactive de donnes et lutilisation de botes outils avec interface graphique.
Interprteurs flexibles, intgrables charger dans vos propres projets.
Outils pour le traitement parallle interactif et de haut niveau.
$ pip install ipython
Pour tlcharger et installer IPython avec toutes ses dpendances optionnelles pour le notebook, qtconsole, les tests et
les autres fonctionnalits
BPython
bpython est une interface alternative linterprteur Python pour les systmes dexploitation de type Unix. Il a les
caractristiques suivantes :
Coloration syntaxique in-line.
Autocompltion similaire readline avec suggestions affiches au fur mesure que vous tapez.
Liste des paramtres attendus pour nimporte quelle fonction Python.
Fonction Rewind pour rafficher la dernire ligne de code depuis la mmoire et la r-valuer.
Envoyez le code entr vers un pastebin.
Sauvegarde du texte entr dans un fichier.
Auto-indentation
Support Python 3.
$ pip install bpython
ptpython
ptpython est une ligne de commande interactive (REPL) construite par dessus la bibliothque prompt_toolkit. Elle est
considre comme une alternative BPython. Les fonctionnalits incluent :
Coloration syntaxique
Autocompltion
dition multi-lignes
Emacs et mode VIM
Encapsulation dune ligne de commande interactive (REPL) lintrieur de votre code
Validation de syntaxe
Pages de tabulation
Support pour lintgration avec le shell IPython, en installant IPython pip install ipython et en ex-
cutant ptipython.
$ pip install ptpython
Environnements virtuels
Un environnement virtuel est un outil pour garder les dpendances requises par diffrents projets dans des emplace-
ments spars, en crant des environnements virtuels Python pour eux. Il rsout le dilemme le projet X dpend de la
version 1.x mais le projet Y ncessite la 4.x, et garde votre rpertoire site-packages global propre et grable.
Par exemple, vous pouvez travailler sur un projet qui ncessite Django 1.3 tout en maintenant aussi un projet qui
ncessite Django 1.0.
virtualenv
virtualenv est un outil pour crer des environnements virtuels Python isols. virtualenv cre un dossier qui contient
tous les excutables ncessaires pour utiliser les paquets quun projet Python pourrait ncessiter.
Installez virtualenv via pip :
Usage basique
$ cd my_project_folder
$ virtualenv venv
Le nom de lenvironnement virtuel actuel apparat maintenant sur la gauche de linvite (cest dire
(venv)Votre-Ordinateur:votre projet VotreNomUtilisateur$) pour vous indiquer quil est ac-
tif. A partir de maintenant, tous les paquets que vous installez en utilisant pip seront placs dans le dossier venv,
isols de linstallation globale de Python.
Installez les paquets comme dhabitude, par exemple :
3. Si vous avez termin de travailler dans lenvironnement virtuel pour le moment, vous pouvez le dsactiver :
$ deactivate
Cela vous fait revenir linterprteur par dfaut Python du systme, avec toutes ses bibliothques installes.
Pour supprimer une environnement virtuel, supprimez juste son dossier. (Dans ce cas, ce serait rm -rf venv.)
Aprs un certain temps, cependant, vous pourriez vous retrouver avec un grand nombre denvironnements virtuels un
peu partout dans votre systme, et il est possible que vous oubliez leurs noms ou o ils ont t placs.
Autres notes
Excuter virtualenv avec loption --no-site-packages ninclura pas les paquets qui sont installs globale-
ment. Cela peut tre utile pour garder la liste des paquets propre dans le cas o il est ncessaire dy accder plus tard.
[Ceci est le comportement par dfaut de virtualenv 1.7 et suprieur.]
Afin de garder votre environnement cohrent, cest une bonne ide de geler ltat actuel des paquets de lenvironne-
ment. Pour ce faire, excutez
Cela va crer un fichier requirements.txt, qui contient une liste simple de tous les paquets qui sont dans len-
vironnement actuel, et leurs versions respectives.Vous pouvez voir la liste des paquets installs sans le format require-
ments en utilisant pip list. Plus tard, il sera plus facile pour un dveloppeur diffrent (ou vous, si vous avez besoin
de recrer lenvironnement) dinstaller les paquets en utilisant les mmes versions :
Cela peut aider assurer la cohrence entre installations, entre dploiements et entre dveloppeurs.
Enfin, rappelez-vous dexclure le dossier de lenvironnement virtuel du gestionnaire de version en lajoutant la liste
des fichiers ignors.
virtualenvwrapper
virtualenvwrapper fournit un jeu de commandes qui permet le travail avec des environnements virtuels beaucoup plus
agrable. Il place galement tous vos environnements virtuels dans un seul endroit.
Pour installer (assurez-vous que virtualenv est dj install) :
Usage basique
$ mkvirtualenv venv
Alternativement, vous pouvez faire un projet, ce qui cre un environnement virtuel, et aussi un rpertoire de projet
lintrieur de $PROJECT_HOME, dans lequel vous tes automatiquement plac via cd quand vous lancez workon
myproject.
$ mkproject myproject
virtualenvwrapper fournit une auto-compltion la tabulation sur les noms denvironnement. Il aide vraiment quand
vous avez beaucoup denvironnements et avez du mal vous souvenir de leurs noms.
workon dsactive aussi nimporte quel des environnements o vous tes actuellement, de sorte que vous pouvez
rapidement basculer entre les environnements.
3. La dsactivation est toujours la mme :
$ deactivate
4. Pour supprimer :
$ rmvirtualenv venv
virtualenv-burrito
Avec virtualenv-burrito, vous pouvez avoir un environnement de travail virtualenv + virtualenvwrapper en une seule
commande.
autoenv
Quand vous faites un cd dans un rpertoire contenant un .env, autoenv active lenvironment automatiquement, par
magie .
Installez-le sous Mac OS X en utilisant brew :
Et sous Linux :
Maintenant, il devrait tre clair que lutilisation denvironnements virtuels est une excellente faon de garder votre
environnement de dveloppement propre et de garder les requirements des diffrents projets distincts.
Lorsque vous commencez travailler sur de nombreux projets diffrents, il peut tre difficile de se rappeler dactiver
lenvironnement virtuel associ quand vous revenez un projet spcifique. De ce fait, il est trs facile dinstaller des
paquets globalement tout en pensant que vous installez vraiment le paquet pour lenvironnement virtuel du projet. Au
fil du temps, cela peut se traduire par une liste globale de paquets dsordonne.
Pour vous assurer que vous installez des paquets dans votre environnement virtuel actif lorsque vous utilisez pip
install, envisagez dajouter les deux lignes suivantes votre fichier ~/.bashrc :
export PIP_REQUIRE_VIRTUALENV=true
Aprs avoir enregistr ce changement et recharg le fichier ~/.bashrc avec source ~/.bashrc, pip ne vous
laissera plus installer des paquets si vous ntes pas dans un environnement virtuel. Si vous essayez dutiliser pip
install en dehors dun environnement virtuel, pip va gentiment vous rappeler quun environnement virtuel actif est
ncessaire pour installer des paquets.
Vous pouvez galement faire cette configuration en ditant votre fichier pip.conf ou pip.ini. pip.conf est
utilis par les systmes dexploitation Unix et Mac OS X et il peut tre trouv dans :
$HOME/.pip/pip.conf
De mme, le fichier pip.ini est utilis par les systmes dexploitations Windows et peut trouv dans :
%HOME%\pip\pip.ini
Si vous navez pas de fichiers a pip.conf ou pip.ini dans ces emplacements, vous pouvez crer un nouveau
fichier avec le nom correct pour votre systme dexploitation.
Si vous avez dj un fichier de configuration, ajoutez juste la ligne suivante sous la configuration [global] pour
obliger lusage dun environnement virtuel actif :
require-virtualenv = true
Si vous navez pas un fichier de configuration, vous devrez en crer un nouveau et ajouter les lignes suivantes votre
nouveau fichier :
[global]
require-virtualenv = true
Vous aurez bien sr besoin dinstaller certains paquets globalement (gnralement ceux que vous utilisez dans diff-
rents projets systmatiquement) et cela peut tre accompli en ajoutant ce qui suit votre fichier ~/.bashrc :
gpip() {
PIP_REQUIRE_VIRTUALENV="" pip "$@"
}
Aprs avoir sauv les changements et recharg votre fichier ~/.bashrc, vous pouvez maintenant installer des pa-
quets globalement en excutant gpip install. Vous pouvez changer le nom de la fonction votre guise, gardez
juste lesprit que vous devrez utiliser ce nom lorsque vous essayerez dinstaller des paquets globalement avec pip.
Chaque dveloppeur a ses bibliothques prfres et quand vous travaillez sur un grand nombre de projets diffrents,
vous tes amens avoir un certain chevauchement entre les bibliothques que vous utilisez. Par exemple, vous utilisez
peut-tre la bibliothque requests dans un grand nombre de projets diffrents.
Il est certainement inutile de retlcharger les mmes paquets/bibliothques chaque fois que vous commencez tra-
vailler sur un nouveau projet (et dans un nouvel environnement virtuel par consquent). Heureusement, vous pouvez
configurer pip de manire ce quil essaie de rutiliser les paquets dj installs.
Sur les systmes UNIX, vous pouvez ajouter la ligne suivante votre fichier .bashrc ou .bash_profile.
export PIP_DOWNLOAD_CACHE=$HOME/.pip/cache
Vous pouvez dfinir les chemins nimporte o ( partir du moment o vous avez les droits en criture). Aprs avoir
ajout cette ligne, faites un source de votre fichier .bashrc (ou .bash_profile) et vous serez fin prt.
Une autre manire de faire la mme configuration est via les fichiers pip.conf ou pip.ini, selon votre systme
dexploitation. Si vous tes sous Windows, vous pouvez ajouter la ligne suivante votre fichier pip.ini sous la
configuration [global] :
download-cache = %HOME%\pip\cache
De mme, sur les systmes UNIX, vous devriez simplement ajouter la ligne suivante votre fichier pip.conf sous
la configuration [global] :
download-cache = $HOME/.pip/cache
Mme si vous pouvez utiliser le chemin que vous voulez pour stocker votre cache, il est recommand que vous criez
un nouveau dossier dans le dossier o votre fichier pip.conf ou pip.ini est situ. Si vous ne vous faites pas
confiance compltement sur cette utilisation obscure des chemins, il suffit dutiliser les valeurs fournies ici et tout ira
bien.
Notes supplmentaires
Cette partie du guide, qui est principalement de la prose, commence avec quelques informations de contexte propos
de Python, puis met laccent sur sur les prochaines tapes.
Introduction
A propos de ce guide
101
Python Guide Documentation, Version 0.0.1
But
Le guide de lauto-stoppeur pour Python existe pour fournir aux dveloppeurs novices comme experts un manuel des
meilleurs pratiques pour linstallation, la configuration et lusage de Python au quotidien.
Par la communaut
Ce guide est architectur et maintenu par Kenneth Reitz de manire ouverte. Cest une effort pilot par la communaut
qui sert un but : servir la communaut.
Pour la communaut
Toutes les contributions au Guide sont les bienvenues, de Pythoneux de tous les niveaux. Si vous pensez quil y a une
lacune dans ce que le guide couvre, forkez le guide sur GitHub et soumettez une pull request.
Les contributions sont bienvenues de la part de tout le monde, que ce soit une vieille main ou un jeune Pythoneux,
et les auteurs du guide seront heureux de vous aider si vous avez des questions sur la pertinence, lexhaustivit ou
lexactitude dune contribution.
Pour commencer travailler sur le guide de lauto-stoppeur, voir la page Contribuer.
La communaut
BDFL
Guido van Rossum, le crateur de Python, est souvent dsign comme le dictateur bienveillant pour la vie (Benevolent
Dictator For Life ou BDFL).
La mission de la Python Software Foundation est de promouvoir, de protger et de faire progresser le langage de
programmation Python et de soutenir et faciliter la croissance dune communaut varie et internationale de program-
meurs Python.
En apprendre plus sur la PSF.
PEPs
Les PEPs sont les Python Enhancement Proposals (Propositions damlioration de Python). Elles dcrivent des modi-
fications sur Python lui-mme, ou sur les standards autour du langage.
Il y a trois types diffrents de PEPs (comme dfini par la PEP 1) :
Standards Dcrit une nouvelle fonctionnalit ou une implmentation.
Informatif Dcrit un problme de conception, des orientations gnrales ou un information pour la com-
munaut.
Procds Dcrit un processu li Python.
PEPs notables
Il y a quelques PEPs qui peuvent tre considres comme une lecture obligatoire :
PEP 8 : Le guide de style Python. Lisez-le, en entier. Suivez-le.
PEP 20 : Le Zen of Python. Une liste de 19 dclarations qui expliquent brivement la philosophie derrire
Python.
PEP 257 : Les conventions docstring. Donne les lignes directrices pour la smantique et les conventions as-
socies avec les docstrings Python.
Vous pouvez en lire plus sur Lindex des PEPs.
Les PEPs sont values par des pairs et acceptes/rejetes aprs beaucoup de discussions. Tout le monde peut crire et
soumettre une PEP pour valuation.
Voici un aperu du workflow dacceptation PEP :
Confrences Python
Les vnements majeurs pour la communaut Python sont des confrences de dveloppeurs. Les deux confrences les
plus notables sont la PyCon, qui se tient aux Etats-Unis, et son homologue europenne, EuroPython.
Une liste complte de confrences est maintenue sur pycon.org.
Les groupes dutilisateurs sont o un groupe de dveloppeurs Python qui se runissent pour prsenter ou parler de
sujets dintrts Python. Une liste des groupes dutilisateurs locaux est maintenue la Python Software Foundation
Wiki.
Apprendre Python
Dbutant
Le tutoriel Python
Cest le tutoriel officiel. Il couvre tous les basiques et offre une visite guide du langage et de la bibliothque standard.
Il est recommand pour ceux qui ont besoin dun guide pour dmarrer rapidement sur le langage.
Le tutoriel Python (fr)
thepythonguru.com est un tutoriel, en anglais, se concentrant sur les programmeurs dbutants. Il couvre de nombreux
concepts Python en profondeur. Il vous enseigne aussi des concepts avancs de Python comme les expressions lambda
ou les expressions rgulires. Enfin, il termine le tutoriel surComment accder une base de donnes MySQL en
utilisant Python
Python for beginners
Learnpython.org est une manire facile et non-intimidante dtre introduit Python. Le site web prend la mme
approche utilise par le site web populaireTry Ruby <http://tryruby.org/>_. Il a un interprteur Python interactif
encapsul dans le site qui vous permet de parcourir les leons sans avoir installer Python localement.
Learn Python
Si vous voulez une livre plus traditionnel, Python For You and Me est une excellente ressource pour apprendre tous les
aspects du langage.
Python for You and Me
Online Python Tutor vous donne une reprsentation visuelle pas pas de la faon dont votre programme fonctionne.
Python Tutor aide les gens dpasser une barrire fondamentale pour apprendre programmer en comprenant ce quil
se passe quand lordinateur excute chaque ligne de source code du programme.
Online Python Tutor
Ce livre pour dbutant est pour ceux qui nont pas dexprience en programmation du tout. Chaque chapitre a un code
source pour une petit jeu, utilisant ces programmes exemple pour dmontrer des concepts de programmation pour
donner au lecteur une ide de ce quoi les programmes ressemblent.
Invent Your Own Computer Games with Python
Ce livre enseigne la programmation Python et de la cryptographie de base pour les dbutants absolus. Les chapitres
fournissent le code source pour divers chiffrements, ainsi que des programmes qui peuvent les briser.
Hacking Secret Ciphers with Python
Ceci est un excellent guide pour le programmeur dbutant sur Python. Il couvre hello world de la console jusquau
web.
Learn Python the Hard Way
Aussi connu sous le nom Python for Programmers with 3 Hours, ce guide donne aux dveloppeurs expriments
venant dautres langages un cours acclr sur Python.
Crash into Python
Dive Into Python 3 est un bon livre pour ceux qui sont prts passer Python 3. Cest une bonne lecture si vous passer
de Python 2 3 ou si vous avez dj un peu dexprience en programmation dans un autre langage.
Dive Into Python 3
Think Python tente de donner une introduction aux concepts de base en informatique via lutilisation du langage
Python. Lobjectif tait de crer un livre avec de nombreux exercices, un jargon minimal et une section dans chaque
chapitre consacr au dbugage.
Tout en explorant les diffrentes fonctionnalits disponibles dans le langage Python, lauteur tisse dans divers design
patterns et les meilleures pratiques.
Le livre inclue galement plusieurs tudes de cas qui font explorer par le lecteur les thmes abords dans le livre plus
en dtail en appliquant ces sujets des exemples du monde rel. Les tudes de cas comprennent des devoirs sur les
interfaces graphiques et lanalyse de Markov.
Think Python
Python Koans
Python Koans est un port de Ruby Koans par Edgecase. Il utilise un approche dirig par le test, voir la SECTION
CONCEPTION PILOTE PAR LES TESTS pour fournir un tutoriel interactif pour enseigner les concepts de base
Python. En corrigeant les dclarations dassertion qui ne chouent dans un script de test, cela fournit des tapes
squentielles pour apprendre Python.
Pour ceux qui sont habitus aux langages et rsoudre des puzzles eux-mmes, cela peut tre un option attrayante,
amusante. Pour ceux qui dcouvrent Python et la programmation, avoir une ressource ou rfrence supplmentaire
peut savrer utile.
Python Koans
Plus dinformations sur le dveloppement pilot par les tests peuvent tre trouves via ces ressources :
Test Driven Development
A Byte of Python
Un livre dintroduction gratuit qui enseigne Python au niveau dbutant. Il assume aucun exprience pralable en
programmation.
A Byte of Python for Python 2.x A Byte of Python for Python 3.x
Un cours Codecademy pour le vrai dbutant Python. Ce cours gratuit et interactif offre et enseigne les bases (et au-
del) de la programmation Python tout en testant les connaissances de lutilisateur au fur et mesure de la progression.
Ce cours comprend galement un interprteur intgr pour avoir un retour immdiat sur votre apprentissage.
Apprendre programmer en Python avec Codecademy (fr)
Intermdiaire
Effective Python
Ce livre contient 59 faons spcifiques pour amliorer lcriture de code pythonique. Avec 227 pages, cest un trs
bref aperu de quelques-unes des adaptations les plus communes que les programmeurs doivent faire pour devenir des
programmeurs Python de niveau intermdiaire.
Effective Python
Avanc
Pro Python
Ce livre est pour les programmeurs Python, intermdiaires avancs, qui cherchent comprendre comment et pourquoi
Python fonctionne comme il le fait et comment ils peuvent faire passer leur code au niveau suprieur.
Pro Python
Expert Python Programming traite des meilleures pratiques en matire de programmation Python et se concentre sur
le public plus avanc.
Il commence avec des sujets tels que les dcorateurs (avec les tudes de cas pour la mise en cache, les proxy et les
gestionnaires de contexte), lordre de rsolution des mthodes (Method Resolution Order ou MRO), en utilisant super()
et la mta-programmation, et les meilleures pratiques PEP 8.
Il a une tude de cas multi-chapitres dtaille sur lcriture et la mise disposition dun paquet, ventuellement
dune application, incluant un chapitre sur lutilisation de zc.buildout. Les chapitres ultrieurs dtaillent les meilleures
pratiques telles que lcriture de la documentation, le dveloppement pilot par les tests, la gestion de version, lopti-
misation et le profilage.
Expert Python Programming
This is a collection of blog posts by Rafe Kettler which explain magic methods in Python. Magic methods are
surrounded by double underscores (i.e. __init__) and can make classes and objects behave in different and magical
ways.Ceci est une collection de billets de blog par Rafe Kettler qui expliquent les mthodes magiques en Python. les
mthodes magiques sont entoures par des underscores doubles (comme __init__) et peuvent faire que les classes et
les objets se comportent de faons diffrentes et magiques.
A Guide to Pythons Magic Methods
A Primer on Scientific Programming with Python, crit par Hans Petter Langtangen, couvre principalement lusage
de Python dans le domaine scientifique. Dans le livre, les exemples sont choisis dans les scieneces mathmatiques et
naturelles.
A Primer on Scientific Programming with Python
Numerical Methods in Engineering with Python, crit par Jaan Kiusalaas, met laccent sur les mthodes numriques
et la faon de les implmenter en Python.
Numerical Methods in Engineering with Python
Sujets divers
Problem Solving with Algorithms and Data Structures couvre une tendue de structures de donnes et algorithmes.
Tous les concepts sont illustrs avec du code Python accompagn dexemples interactifs qui peuvent tre excuts
directement dans le navigateur.
Problem Solving with Algorithms and Data Structures
Programming Collective Intelligence introduit un large ventail de mthodes de base sur le machine learning et le
data mining. Lexposition est pas trs formelle mathmatiquement, mais met laccent sur lexplication dintuitions
sous-jacentes et montre comment implmenter les algorithmes en Python.
Programming Collective Intelligence
Transforming Code into Beautiful, Idiomatic Python est une vido par Raymond Hettinger. Apprenez mieux tirer
parti des meilleures fonctionnalits de Python et amliorer le code existant via une srie de transformations de code,
Quand vous voyez ceci, faites cela la place.
Transforming Code into Beautiful, Idiomatic Python
Fullstack Python
Fullstack Python offre une ressource complte couvrant toute la chane de production pour le dveloppement web en
utilisant Python.
De la mise en place du serveur web, la conception du front-end, au choix dune base de donnes, loptimisa-
tion/dimensionnement, etc.
Comme le nom le suggre, il couvre tout ce dont vont avez besoin pour construire et excuter une application web en
partant de zro.
Fullstack Python
Rfrences
Python in a Nutshell
Python in a Nutshell, crit par Alex Martelli, couvre la plupart des usages Python multi-plateforme, de sa syntaxe pour
les bibliothques intgres aux sujets avancs comme lcriture dextensions C.
Python in a Nutshell
Cest le manuel de rfrence de Python officiel. Il couvre la syntaxe et la smantique de base du langage.
La rfrence du langage Python (en)
Python Essential Reference, crit par David Beazley, est le guide de rfrence dfinitif pour Python. Il explique de
manire concise tant le cur du langage et les parties les plus essentielles de la bibliothque standard. Il couvre les
versions de Python 3 et 2.6.
Python Essential Reference
Python Pocket Reference, crit par Mark Lutz, est une rfrence pour le cur du langage facile utiliser, avec les
descriptions des modules et des botes outils utiliss gnralement. Il couvre les versions de Python 3 et 2.6.
Python Pocket Reference
Python Cookbook
Python Cookbook, crit par David Beazley et Brian K. Jones, est associ des exemples pratiques. Ce livre couvre le
cur du langage Python ainsi que des tches communes une grande varit de domaines dapplication.
Python Cookbook
Writing Idiomatic Python, crit par Jeff Knupp, contient les idiomes Python les plus courants et les plus importants
dans un format qui maximise lidentification et la comprhension. Chaque idiome est prsent comme une recomman-
dation sur la faon dcrire un morceau de code couramment utilis, suivi dune explication du pourquoi cet idiome est
important. Il contient aussi deux exemples de code pour chaque idiome : la manire Nocive de lcrire et la manire
Idiomatique.
Pour Python 2.7.3+
Pour Python 3.3+
Documentation
Documentation officielle
Read the Docs est un projet communautaire populaire qui hberge la documentation de logiciels open source. Il
contient la documentation de nombreux modules Python, la fois ceux populaires comme ceux exotiques.
Read the Docs
pydoc
pydoc est un utilitaire qui est install lorsque vous installez Python. Il vous permet de rcuprer et rechercher rapi-
dement de la documentation depuis votre terminal. Par exemple, si vous avez besoin dun rapide rappel sur le module
time, rcuprer la documentation serait aussi simple que
$ pydoc time
La ligne de commande ci-dessus est essentiellement lquivalent douvrir la ligne de commande Python interactive et
de lexcuter
>>> help(time)
Actualits
Planet Python
Cest une agrgation dactualits Python provenant dun nombre grandissant de dveloppeurs.
Planet Python
/r/python
/r/python est la communaut Reddit sur Python o les utilisateurs contribuent et votent sur les actualits lies Python.
/r/python
Pycoders Weekly
Pycoders Weekly est une lettre dactualit hebdomadaire gratuite sur Python pour des dveloppeurs Python par des
dveloppeurs Python (projets, articles, actualits et emplois).
Pycoders Weekly
Python Weekly
Python Weekly est une lettre dactualit hebdomadaire gratuite slectionnant des actualits, articles, nouvelles sorties
logicielles, emplois, etc. lies Python.
Python Weekly
Python News
Python News est la section actualits dans le site web officiel Python (www.python.org). Il met en avant brivement
les actualits de la communaut Python.
Python News
Weekly Python Newsletter contient des articles, projets, vidos, tweets sur Python, directement envoys dans votre
boite mail. Gardez vos comptences de programmation Python jour.
Import Python Weekly Newsletter
Un aperu hebdomadaire des actualits, articles et paquets Python les plus populaires.
Awesome Python Newsletter
Note : Les notes dfinies dans les chelles musicales diatoniques et chromatiques ont t intentionnellement exclues
de la liste des notes additionnelles. Do la prsence de cette note.
Contribuer
Guide de style
Si vous voulez contribuer, il y a plein de choses faire. Voici un courte liste de todo.
tablir les recommandations entre utilisez ceci contre les alternatives sont....
faire
Ecrire propos de Blueprint
faire
crire propos de Numba et du compilateur autojit pour NumPy
faire
Complter le stub Geler votre code
faire
crire les tapes pour les excutables les basiques
faire
Inclure des exemples de code de code exemplaire de chacun des projets numrs. Expliquer pourquoi
cest un excellent code. Utilisez des exemples complexes.
faire
Expliquer les techniques pour identifier rapidement les structures de donnes, les algorithmes et dtermi-
ner ce que le code fait.
Licence
Ce guide est sous licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mmes
Conditions 3.0 non transpos (CC BY-NC-SA 3.0).
Comme avec toute documentation, avoir un format consistant aide rendre le document plus comprhensible. Afin de
rendre ce guide plus facile assimiler, toutes les contributions doivent se tenir aux rgles de ce guide de style, le cas
chant.
Le guide est crit avec du reStructuredText.
Note : Des parties du guide peuvent ne pas respecter encore le guide de style. Nhsitez pas mettre jour ces parties
pour les mettre en conformit avec le guide de style du guide.
Note : Sur nimporte quelle page du HTML rendu, vous pouvez cliquer Afficher le code source de la page pour voir
comment les auteurs ont styl la page.
Pertinence
Rubriques
#########
Chapter 1
#########
Titre de page :
===================
Time is an Illusion
===================
Rubriques de la section :
Lunchtime Doubly So
-------------------
Rubriques de la sous-section :
Very Deep
~~~~~~~~~
Prose
Faites des retours la ligne 78 caractres. Quand cest ncessaire, les lignes peuvent dpasser 78 caractres, particu-
lirement si faire des retours la ligne rend le texte source plus difficile lire.
Utilisez la virgule de srie (aussi connue comme la virgule dOxford) est 100% non-optionnel. Toute tentative pour
soumettre un contenu avec une virgule manquante donnera lieu un bannissement permanent de ce projet, pour cause
dabsence complte et totale de got.
Bannissement ? Cest une blague ? Nous esprons ne jamais avoir le dcouvrir.
Exemples de code
Faites des retours la ligne 70 caractres pour tous les exemples de code, pour viter des barres de dfilement
horizontales.
Exemples de ligne de commande :
.. code-block:: console
.. code-block:: python
.. code-block:: python
def get_answer():
return 42
Liens externes
Prfrez des tiquettes pour les sujets biens connus (ex : des noms complets) quand vous faites des liens :
Sphinx_ is used to document Python.
.. _Sphinx: http://sphinx.pocoo.org
Prfrez utiliser des tiquettes descriptives pour les liens inline plutt que de laisser des liens en brut :
Pour faire des rfrences croises dautres parties de cette documentation, utilisez mot-cl et tiquettes :ref:.
Pour faire rfrence aux tiquettes plus claires et uniques, ajoutez toujours un suffixe-ref :
.. _some-section-ref:
Some Section
------------
Notes et alertes
Utilisez les directives dadmonitions appropries quand vous ajoutez des notes.
Notes :
.. note::
The Hitchhikers Guide to the Galaxy has a few things to say
on the subject of towels. A towel, it says, is about the most
massively useful thing an interstellar hitch hiker can have.
Alertes :
TODOs
Merci de marquer tous les endroits incomplets du guide avec une directive todo. Pour viter dencombrer la Liste de
choses faire (Todo), utilisez un seul todo pour les bouts de code ou les sections incompltes importantes.
.. todo::
Learn the Ultimate Answer to the Ultimate Question
of Life, The Universe, and Everything
P
PATH, 6, 7
Python Enhancement Proposals
PEP 0257#specification, 34
PEP 1, 102
PEP 20, 28, 103
PEP 249, 59
PEP 257, 103
PEP 282, 39
PEP 3101, 22
PEP 3132, 26
PEP 3333, 48
PEP 391, 41
PEP 8, 28, 91, 103, 106
PEP 8#comments, 34
V
variable denvironnement
PATH, 6, 7
115