Python (langage) 2340 31794690 2008-07-22T16:19:38Z Surt Fafnir 180455 /* Interfaces Graphiques */ ajout d'une bibliothèque {{Voir homonymes|Python}} {{Infobox Langage de programmation | nom = Python | logo = [[Image:Python logo.svg|200px]] | paradigmes = [[Programmation orientée objet|Objet]], [[Programmation impérative|impératif]] | année = [[1990]] | auteur = [[Guido van Rossum]] | développeurs = [[Python Software Foundation]] | dernière version = 2.5.2 ({{Date|22|février|2008}}) | typage = [[Typage fort|Fort]], [[Typage dynamique|dynamique]] | implémentations = [[CPython]], [[Jython]], [[IronPython]], [[PyPy]] | dialectes = | influencé par = [[ABC (langage)|ABC]], [[C (langage)|C]], [[Icon]], [[Modula-3]], [[Perl (langage)|Perl]], [[Smalltalk]], [[Tool Command Language|Tcl]] | a influencé = [[Ruby]], [[Boo (langage)|Boo]] | système d'exploitation = [[Multi-plate-forme]] | licence = [[Python Software Foundation License]] | site web = http://www.python.org }} '''Python''' est un [[langage de programmation]] interprété multi-[[paradigme (programmation)|paradigme]]. Il favorise la [[programmation impérative]] structurée, et [[orienté objet|orientée objet]]. Il est doté d'un [[typage dynamique]] [[typage fort|fort]], d'une gestion automatique de la mémoire par [[ramasse-miettes]] et d'un [[système de gestion d'exceptions]] ; il est ainsi similaire à [[Perl (langage)|Perl]], [[Ruby]], [[Scheme]], [[Smalltalk]] et [[Tool Command Language|Tcl]]. Le langage Python est placé sous une licence libre proche de la [[licence BSD]]<ref>[http://www.python.org/psf/license/ Python License]</ref> et fonctionne sur la plupart des plates-formes informatiques, des [[supercalculateur]]s aux [[Ordinateur central|ordinateurs centraux]], de [[Windows]] à [[Unix]] en passant par [[Linux]] et [[MacOS]], avec [[java (langage)|Java]] ou encore [[Microsoft .NET|.NET]]. Il est conçu pour optimiser la productivité des programmeurs en offrant des outils de [[Langage de haut niveau|haut-niveau]] et une syntaxe simple à utiliser. Il est également apprécié par les pédagogues qui y trouvent un langage où la syntaxe clairement séparée des mécanismes de [[Langage de bas niveau|bas niveau]], permet une initiation plus aisée aux concepts de base de la programmation.<ref>{{en}} [http://www.openbookproject.net//thinkCSpy/preface.xhtml#auto2 « il faut treize paragraphes pour expliquer un "hello world!" en C++, en python il n'en faut que 2 »]</ref> == Utilisations == Python est un [[Langage de programmation|langage]] qui peut s'utiliser dans de nombreux contextes et s'adapter à tout type d'utilisation grâce à des bibliothèques spécialisées à chaque traitement. Il est cependant particulièrement utilisé comme [[langage de script]] pour automatiser des tâches simples mais fastidieuses comme par exemple un script qui récupérerait la météo sur internet ou qui s'intégrerait dans un logiciel de [[conception assistée par ordinateur]] afin d'automatiser certains enchaînements d'actions répétitives. On l'utilise également comme langage de développement de prototype lorsqu'on a besoin d'une application fonctionnelle avant de l'optimiser avec un langage de plus bas niveau. Il est particulièrement répandu dans le monde scientifique, et possède de nombreuses extensions destinées aux applications numériques. == Histoire == Guido van Rossum a participé au développement du langage de programmation [[ABC (langage)|ABC]] au [[Centrum voor Wiskunde en Informatica]] (CWI) aux [[Pays-Bas]]. === Au CWI === Il travaillait alors dans l’équipe du système d’exploitation [[Amoeba]] dont les appels systèmes était difficilement interfaçables avec le [[bourne shell]] qui était utilisé comme interface utilisateur. Il estima alors qu’un langage de script inspiré d’ABC pourrait être intéressant comme interpréteur de commandes pour Amoeba<ref name="FAQ1.2">[http://www.python.org/doc/faq/general/#why-was-python-created-in-the-first-place ''{{lang|en|FAQ Python 1.2 Why was Python created in the first place?}}'']</ref> En 1989, profitant d’une semaine de vacances durant les fêtes de Noël, il utilise son Macintosh personnel<ref> [http://homepages.cwi.nl/~jack/macpython/intro.html ''{{lang|en|Introduction to MacPython}}'']</ref> pour écrire la première version du langage. Fan de la série télévisé des [[Monty Python]], il décide de baptiser ce projet python. Il s’est principalement inspiré d’ABC, par exemple pour l’[[indentation comme syntaxe]] ou les types de haut niveau mais aussi de [[Modula-3]] pour la gestion des [[Système de gestion d'exceptions|exceptions]], du [[langage C]] et des outils UNIX<ref>[http://www.python.org/doc/essays/foreword/ Introduction de la 1er édition du livre "Programming Python" de Mark Lutz], Guido van Rossum 1996</ref>. Durant l’année suivante le langage commence a être adopté par l’équipe du projet Amoeba, Guido poursuivant son développement principalement pendant son temps libre. En février 1991 la première version publique, numérotée 0.9.0<ref>selon le fichier [http://svn.python.org/projects/python/trunk/Misc/HISTORY HISTORY] mais la plus ancienne versions accessibles dans les archives du forum est la [http://groups.google.com/group/alt.sources/browse_thread/thread/3b6652abb0e23b03/53ee3620bc53c281 0.9.1]</ref>, est postée sur le forum [[Usenet]] alt.sources. La dernière version sortie au CWI était Python 1.2. ===Au CNRI=== En 1995, Van Rossum continua son travail sur Python au [[Corporation for National Research Initiatives|CNRI]] à [[Reston]], aux [[États-Unis]], où il sortit plusieurs versions du logiciel. A partir d'août 1995, l'équipe python travaille au CNRI sur ''Grail''<ref>[http://grail.sourceforge.net/info/team.html The Grail Development Team<!-- Titre généré automatiquement -->]</ref> un navigateur internet utilisant [[Tk (informatique)|Tk]]. Il est l'équivalent pour python du navigateur [[HotJava]], permettant d'exécuter des applets dans un environnement sécurisé. La première version publique, disponible en novembre, est la 0.2<ref>[http://grail.sourceforge.net/info/papers/restofus.html ''Grail -- The Browser For The Rest Of Us'']</ref>. Il a entraîné le développement de modules pour la librairie standard comme ''rexec''<ref>[http://docs.python.org/lib/module-rexec.html 28.1 rexec - Restricted execution framework<!-- Titre généré automatiquement -->]</ref>, ''htmllib'' ou ''urllib''<ref>http://grail.sourceforge.net/info/diagram.gif</ref>. La version 0.6 sera la dernière de ''Grail''; elle est publiée en avril 1999<ref>[http://grail.sourceforge.net/ Grail Home Page<!-- Titre généré automatiquement -->]</ref>. En 1999 le projet ''Computer Programming for Everybody'' (CP4E) est lancé avec collaboration entre le CNRI et la [[DARPA]]. Il s'agit d'utiliser python comme langage d'enseignement de la programmation. Cette initiative conduira à la création de l'environnement de développement IDLE. Les subventions fournies par la DARPA ne suffisant pas à pérenniser le projet, Guido doit quitter le CNRI<ref>[http://www.python.org/doc/essays/cp4e Computer Programming for Everybody<!-- Titre généré automatiquement -->]</ref>. Python 1.6 fut la dernière version sortie au CNRI. === A BeOpen === Après la sortie de Python 1.6, et après que Van Rossum a quitté le CNRI pour travailler avec des développeurs de logiciels commerciaux, le CNRI et la [[Fondation pour le logiciel libre]] collaborèrent pour modifier la licence de Python afin de la rendre compatible avec la GPL. Python 1.6.1 est essentiellement le même que Python 1.6 avec quelques correctifs mineurs et la nouvelle licence compatible GPL. En 2000, l'équipe principale de développement de Python déménagea à [[BeOpen.com]] pour former l'équipe [[PythonLabs]] de BeOpen. Python 2.0 fut la seule version sortie à BeOpen.com. Après cette version, Guido Van Rossum et les autres développeurs de PythonLabs rejoignirent [[Digital Creations]]. Andrew M. Kuchling a publié en décembre 1999<ref>[http://mail.python.org/pipermail/python-list/1999-December/018678.html Python warts<!-- Titre généré automatiquement -->]</ref> un texte nommée ''python warts''<ref>[http://web.archive.org/web/20031002184114/www.amk.ca/python/writing/warts.html Python Warts<!-- Titre généré automatiquement -->]</ref> qui synthétise les griefs les plus fréquent exprimés à l'encontre du langage. Ce document aura une influence certaine sur les développements futurs du langage<ref>[http://www.python.org/download/releases/2.2.3/descrintro/ Unifying types and classes in Python 2.2<!-- Titre généré automatiquement -->]</ref>. === La Python Software Foundation === Python 2.1 fut une version dérivée de Python 1.6.1, ainsi que de Python 2.0. Sa licence fut renommée [[Python Software Foundation License]]. Tout code, documentation et spécifications ajouté, depuis la sortie de Python 2.1 alpha, est détenu par la [[Python Software Foundation]] (PSF), une association sans but lucratif fondée en 2001, modelée d'après l'[[Apache Software Foundation]]. Un développement parallèle, entamé en 2004, est en discussion pour Python 3.0. Cette nouvelle version cassera la compatibilité ascendante afin de réparer certains défauts du langage (orientation objet avec deux types de classes, etc), et pour nettoyer la bibliothèque standard de ses éléments obsolètes et redondants. La première version alpha est sortie en septembre 2007. ==Caractéristique du langage== === Syntaxe === Python a été conçu pour être un langage lisible. Il vise à être visuellement épuré, et utilise des mots anglais fréquemment là où d'autres langages utilisent de la ponctuation, et possède également moins de constructions syntaxiques que de nombreux langages structurés tels que C, Perl, ou Pascal. Les blocs sont identifiés par l'[[indentation]], au lieu d'accolades comme en [[Langage C|C]]/[[C plus plus|C++]], ou de Begin ... End comme en [[Langage Pascal|Pascal]]. Une augmentation de l'indentation marque le début d'un bloc, et une réduction de l'indentation marque la fin du bloc courant. Les parenthèses sont facultatives dans les structures de contrôle : {| class="wikitable" !width="50%"|Fonction factorielle en C !width="50%"|Fonction factorielle en Python |- | <source lang="C"> int factorielle(int x) { if (x == 0) return 1; else return x * factorielle(x-1); } </source> | <source lang="python"> def factorielle(x): if x == 0: return 1 else: return x * factorielle(x-1) </source> |} ====Types de base==== Les types de base en Python sont relativement complets et puissants, il y a entre autres : * Les objets numériques ** <code>int</code> est un entier classique. ** <code>long</code> est un entier dont la mémoire de stockage est allouée dynamiquement, la taille maximale n'est donc pas fixe et dépend de la capacité de la machine. **<code>float</code> est un flottant équivalent au double du C. **<code>complex</code> est une approximation d'un [[nombre complexe]] (typiquement deux <code>floats</code>) * Les objets "itérables" ** Les objets <code>list</code> sont des tableaux dynamiques (ils étendent automatiquement leur taille lorsque nécessaire) et acceptent des types de données hétérogènes. ** Les objets <code>set</code> sont des ensembles non ordonnés d'objets. ** Les objets <code>dict</code> sont des [[Tableau associatif|tableaux associatifs]] (ou dictionnaires) permettant d'associer un objet (une clef) à un autre. ** Les objets <code>str</code> sont des chaînes de caractères, qui possèdent une multitude de méthodes de base pour remplacer des mots, éliminer les espaces blancs, séparer le texte en morceau, etc. Ce sont des objets itérables car ils peuvent être vus comme des listes d'autres <code>str</code> d'un seul caractère. ** Les <code>tuple</code> (ou <code>[[n-uplet]]</code>) sont une variante non mutable des listes ; de même il existe une version immutable des dictionnaires (<code>frozendict</code>) et des ensembles (<code>frozenset</code>). Les objets itérables sont parcourus à l'aide d'une boucle <code>for</code> de la manière suivante : <source lang="python"> for element in objet_iterable: traiter(element) </source> Il est possible de dériver les classes des types de base pour créer ses propres types. On peut également fabriquer ses propres types d'objets itérables sans hériter des itérables de base en implémentant le protocole d'itération du langage. ====Programmation fonctionnelle==== Python permet de programmer dans un style fonctionnel. Les [[compréhension de liste|compréhensions de listes]] sont disponibles. Par exemple, pour construire la liste des carrés des entiers naturels plus petits que 10, on peut utiliser l'expression : <source lang="python"> l = [x**2 for x in range(10)] </source> la liste des nombres '''pairs''' : <source lang="python"> l = [entier for entier in range(10) if entier % 2 == 0] </source> Une forme limitée de [[Lambda calcul|fonctions lambda]], ou fonctions anonymes, est disponible : <source lang="python"> lambda x: x+2 </source> Les fonctions lambda peuvent être définies en ligne et utilisées comme arguments dans des expressions fonctionnelles : <code> filter(lambda x: x < 5, une_liste) </code> retournera une liste constituée des éléments de une_liste inférieurs à 5. Le même résultat peut être obtenu avec <code> [x for x in une_liste if x <5] </code>. Les lambdas de Python n'admettent que des expressions et ne peuvent être utilisées comme fonctions anonymes généralisées ; mais en Python, toutes les fonctions sont des objets, qui peuvent donc être passés en arguments d'autres fonctions, et appelés lorsque nécessaire. ====Programmation objet==== La programmation objet est très bien supportée par Python : tous les types de base, les fonctions, les instances de classes (les objets « classiques » des langages C++ et Java) et les classes elles-mêmes (qui sont des instances de méta-classes) sont des objets. Une classe se définit avec le mot <code>class<code>. Les classes Python supportent l'héritage multiple ; il n'y a pas de [[Surcharge des opérateurs|surcharge statique]] comme en C++/Java, mais le mécanisme des arguments optionnels et par mot-clef est plus général et plus flexible. En Python, l'attribut d'un objet peut référencer une variable d'instance ou de classe (le plus souvent une méthode). Il est possible de lire ou de modifier un attribut dynamiquement avec les fonctions : * <code>getattr(objet, 'nom_attribut') <code> * <code>setattr(objet, 'nom_attribut', nouvel_attribut)<code> Exemple de deux classes simples : <source lang="python"> class Personne: def __init__(self, nom, prenom): self.nom = nom self.prenom = prenom def presenter(self) : return self.nom+' '+self.prenom class Etudiant(Personne): def __init__(self, classe, nom, prenom): Personne.__init__(self, nom, prenom) self.classe = classe def presenter(self): return self.classe + Personne.presenter(self) e = Etudiant('License INFO', 'Dupontel', 'Albert') assert e.nom == 'Dupontel' </source> ====Méthodes spéciales et surcharge des opérateurs==== Python fournit un mécanisme élégant et orienté objet pour la surcharge des opérateurs: tout objet python peut se voir doter de méthodes dites spéciales. Ces méthodes, commençant et finissant par deux underscores, sont appelées lors de l'utilisation d'un opérateur sur l'objet : + (methode __add__), += (méthode __iadd__), [] (méthode __getitem__), () (méthode __call__), ... Des méthodes comme __repr__ et __str__, permettent de définir la représentation d'un objet dans l'interpréteur interactif et son rendu avec le mot clé ''print''. Les possibilités sont nombreuses et sont décrites dans la documentation du langage : http://docs.python.org/ref/specialnames.html. Par exemple on peut définir l'addition de deux vecteurs à 2 dimensions avec la classe suivante : <source lang="python"> class Vector2D: def __init__(self, x, y): # On utilise un tuple pour stocker les coordonnées self.coords = (x, y) def __add__(self, other): # L'instruction a+b sera résolue comme a.__add__(b) # On construit un objet Vector2D à partir des coordonnée propres à l'objet et de l'autre opérande return Vector2D(self.coords[0]+other.coords[0], self.coords[1]+other.coords[1]) def __repr__(self): # L'affichage de l'objet dans l'interpréteur return "Vector2D(%s, %s)" %self.coords >>> a = Vector2D(1, 2) >>> b = Vector2D(3, 4) >>> print a+b Vector2D(4, 6) </source> ====Générateurs==== Le mot-clef ''yield'' utilisé dans une fonction permet de faire de cette fonction un générateur. L'appel de cette fonction renvoie un objet de type ''generator'', qui peut être utilisé dans une boucle ''for'', par exemple. À chaque appel, le générateur effectue son traitement jusqu'à rencontrer le mot-clé ''yield'', renvoie la valeur de l'expression devant ''yield'', et à l'appel suivant, reprend son déroulement juste après le ''yield''. Par exemple pour calculer la suite de Fibonacci, on peut faire : <source lang="python"> import sys def gen_fibonacci(max=sys.maxint): a=0 b=1 while a<max: yield a a,b = b,a+b for n in gen_fibonacci(1000): print n </source> === Réflexivité === Grâce à un usage intensif des dictionnaires (conteneur associatif implémenté avec des [[table de hachage]]), Python permet d'explorer les divers objets du langage ([[introspection (informatique)|introspection]]) et dans certains cas de les modifier ([[intercession(informatique)|intercession]]). === Typage === Le [[typage]] n'est pas vérifié à la compilation. De ce fait, des opérations sur un objet peuvent échouer, signifiant que l'objet en question n'est pas du bon type. Malgré l'absence de typage statique, Python est fortement typé, interdisant des opérations ayant peu de sens (comme, par exemple, additionner un nombre à une chaîne de caractères) au lieu de tenter silencieusement de la convertir en une forme qui a du sens. Python propose des fonctions permettant de transformer les variables dans un autre type : <source lang="python"> points = 3.2 # points est du type float print "Tu as " + points + " points !" # Génère une erreur de typage points = int(points) # points est maintenant du type int (et vaut 3) print "Tu as " + points + " points !" # Génère une erreur de typage points = str(points) # points est maintenant du type str (chaîne de caractères) print "Tu as " + points + " points !" # Plus d'erreur de typage, affiche 'Tu as 3 points !' </source> De même, chaque variable devra être déclarée avant d'être utilisée. Python propose aussi un mécanisme de [[typage fort]] grâce à l'API ''trait'' ou au design pattern ''decorators''. ====Compilation==== Il est cependant possible d'effectuer une analyse statique des modules Python avec des outils comme Pylint ou PyChecker. Ceux-ci éliminent la plupart des fautes, comme une classe qui hérite d'une classe abstraite et qui ne surcharge pas les méthodes abstraites, ou bien des variables utilisées avant d'être déclarées, ou encore des attributs d'instance déclarés en dehors de la méthode __init__, etc. En fonction de la nature du projet, ces outils peuvent être réglés de façon fine afin d'obtenir une très grande qualité de code. Il est aussi possible de générer un Bytecode Python. Des outils comme PyInstaller<ref>{{en}} [http://pyinstaller.python-hosting.com/ Site officiel de PyInstaller]</ref> ou d'autres plus spécifiques comme Freeze sous [[Unix]] et [[py2exe]] sous [[Microsoft Windows|Windows]] permettent de « compiler » un programme Python sous forme d'un exécutable comprenant le programme et un interpréteur Python. Le programme ne tourne pas plus rapidement (il n'est pas compilé sous forme de code machine) mais cela simplifie largement sa distribution, notamment sur des machines où l'interpréteur python n'est pas installé. ===Modèle objet=== En python ''tout est objet'', dans le sens qu'une variable peut contenir une [[référence (informatique)|référence]] vers tous les éléments manipulés par le langage : nombres, méthodes, modules, etc.<ref>[http://diveintopython.adrahon.org/getting_to_know_python/everything_is_an_object.html 2.4. Tout est objet<!-- Titre généré automatiquement -->]</ref> Néanmoins, avant la version 2.2, les classes et les instances de classes étaient un type d'objet particulier, ce qui signifiait qu'il était par exemple impossible de dériver sa propre sous classes de l'objet ''list''. ==== Méthodes ==== Le modèle objet de python est inspiré de celui de Modula-3<ref>[http://docs.python.org/tut/node11.html ''Python Tutorial''] chapitre 9</ref>. Parmi ces emprunts se trouve l'obligation de déclarer l'instance de l'objet courant, conventionnellement nommée ''self'', comme premier argument des méthode, et à chaque fois que l'on souhaite accéder à une donnée de cet instance dans le corps de cette méthode. Cette pratique n'est pas naturelle pour des programmeurs venant par exemple de C++ ou Java, la profusion des ''self'' étant souvent critiquée comme étant une pollution visuelle qui gène la lecture du code. Les promoteurs du ''self'' explicite estiment au contraire qu'il évite le recours à des convention de nommage pour les données membres et qui simplifie des taches comme l'appel à un méthode de la superclasse ou la résolution d'homonymie entre données membres<ref>[http://effbot.org/pyfaq/why-must-self-be-used-explicitly-in-method-definitions-and-calls.htm Why must 'self' be used explicitly in method definitions and calls?<!-- Titre généré automatiquement -->]</ref>. Il permet par ailleurs un traitement orthogonal des méthodes et fonctions. Python reconnaît trois type de méthodes : * les méthodes d'instances, qui sont celles définies par défaut. Elle reçoivent comme premier argument une instance de la classe ou elles ont été définies. * les méthodes de classes, qui reçoivent comme premier argument la classe ou elles ont été définie. Elles peuvent être appelées depuis une instance ou directement depuis la classe. Elles permettent de définir des constructeurs alternatifs comme la méthode ''fromkeys()'' de l'objet ''dict''. * les méthodes statiques, qui ne reçoivent pas de premier argument implicite. Elles sont similaires aux méthodes statiques que l'on trouve en Java ou C++. ==== Visibilité ==== Le langage a un support très limité de l'[[encapsulation (programmation)|encapsulation]]. Il n'y a pas, comme en java par exemple, de contrôle de l'accessibilité par des mots clefs comme ''protected'' ou ''private''. La philosophie de python est de différencier conceptuellement l'encapsulation du masquage d'information. Le masquage d'information vise à prévenir les utilisations frauduleuses, c'est une préoccupation de [[sécurité du système d'information|sécurité informatique]] . Le module ''bastion'' de la librairie standard, qui n'est plus maintenu dans les dernières versions du langage, permettait ainsi de contrôler l'accès aux attributs d'un objet dans le cadre environnement d'exécution restreint. L'encapsulation est une problématique de développement logiciel. Le slogan des développeurs python est ''we're all consenting adults here''<ref>[http://www.mactech.com/articles/mactech/Vol.20/20.11/PythonForAppleScripters/index.html Python For AppleScripters<!-- Titre généré automatiquement -->]</ref> (nous sommes entre adultes consentants). Il estiment en effet qu'il suffit d'indiquer, par des conventions d'écriture, les parties publiques des interfaces et que c'est aux utilisateurs des objets de se conformer à ces conventions ou de prendre leurs responsabilités. L'usage est de préfixer par un underscore les membres privés. Le langage permet par ailleurs d'utiliser un double underscore pour éviter les collisions de noms, en préfixant automatiquement le nom de la donnée par celui de la classe ou elle est définie. L'utilisation de la fonction property() permet de définir des propriétés qui ont pour but d'intercepter à l'aide de méthodes les accès à une donnée membre. Ils rendent donc inutile la définition systématiques d'accesseurs et le masquage des données comme il est courant de le faire en C++ par exemple. ==== Héritage ==== Python supporte l'[[héritage multiple]]. Depuis la version 2.3, il utilise l'[[algorithme C3]], issu du langage [[Dylan (langage)|Dylan]]<ref>[http://192.220.96.201/dylan/linearization-oopsla96.html A Monotonic Superclass Linearization for Dylan<!-- Titre généré automatiquement -->]</ref>, pour résoudre l'[[ordre de résolution de méthode]] (''MRO]''). Les versions précédentes utilisaient un [[algorithme de parcours en profondeur]] qui posait des problèmes dans le cas d'un [[héritage en diamant]]<ref>[http://www.python.org/download/releases/2.3/mro/ The Python 2.3 Method Resolution Order<!-- Titre généré automatiquement -->]</ref>. == Bibliothèque standard == [[Image:Python Piles Incluses.jpg|thumb|250px|Python est fourni « Piles Incluses ».]] Python possède une grande [[bibliothèque standard]], fournissant des outils convenant à de nombreuses tâches diverses. Les modules de la bibliothèque standard peuvent être augmentés avec des modules spécifiques écrits en C ou en Python. La bibliothèque standard est particulièrement bien conçue pour écrire des applications utilisant Internet, avec un grand nombre de formats et de protocoles standards gérés (tels que [[MIME]] et [[HTTP]]). Des modules pour créer des [[interface graphique|interfaces graphiques]] et manipuler des [[expression rationnelle|expressions rationnelles]] sont également fournis. Python inclut également un [[framework]] de tests unitaire pour créer des suites de test exhaustives. == Interfaces Graphiques == Python possède plusieurs modules disponibles pour la création de logiciels avec une interface graphique. Le plus répandu est Tkinter, qui fait partie de la bibliothèque standard, et qui est donc installé avec Python. Ce module convient à beaucoup d'applications et peut être considéré comme suffisant dans la plupart des cas. Néanmoins, d'autres modules ont été créés pour pouvoir lier Python à d'autres [[bibliothèque logicielle]]s ('[[toolkit]]'), pour davantage de fonctionnalités, pour une meilleure intégration avec le système d'exploitation utilisé, ou simplement pour pouvoir utiliser Python avec sa bibliothèque préférée. Aussi, il faut dire que certains programmeurs trouvent l'utilisation de Tkinter plus pénible que d'autres bibliothèques. Ces autres modules ne font pas partie de la bibliothèque standard et doivent donc être obtenus séparément. Les principaux modules donnant accès aux bibliothèques d'interface graphique sont [[Tkinter]] pour [[Tk (informatique)|Tk]], [[wxPython]] pour [[wxWidgets]], [[PyGTK]] pour [[GTK+]], [[PyQt]] pour [[Qt]], FxPy pour le FOX Toolkit, et Pmw pour Mega-Widgets, il existe aussi une implantation de SDL : [[Pygame]], et un binding de la [[SFML]] : PySFML. ==La communauté python == Van Rossum est le principal auteur de Python, et son rôle de décideur central permanent de Python est reconnu avec humour par le titre de « Dictateur bienveillant à vie » (''Benevolent Dictator for Life'', BDFL). Il est assisté d'une équipe de ''core developers'' qui ont un accès en écriture au repository de CPython et qui se coordonnent sur la liste de diffusion python-dev. Ils travaillent principalement sur le langage et la bibliothèque de base. Ils reçoivent ponctuellement les contributions d'autres développeurs python via la plateforme de gestion de bug sourceforge. Les utilisateurs ou développeurs de librairies tierces utilisent diverses autres ressources. Le principal média généraliste autour de python est le forum Usenet anglais comp.lang.python. Les allusion aux Monty Python sont assez fréquentes. Les didacticiels consacrés à python utilisent souvent les mots ''spam'' et ''eggs'' comme [[variable métasyntaxique]]. Il s'agit d'une référence à l'épisode 25 de la deuxième saison du [[Monty Python's Flying Circus]], ou deux clients tentent de commander un repas à l'aide d'une carte qui contient du jambon en conserve (le spam) dans pratiquement tous les plats. ===Adoption de Python=== Plusieurs entreprises mentionnent sur le site officiel<ref>[http://www.python.org/about/quotes/ Quotes about Python]</ref> qu'elles utilisent Python : * [[Google]] ([[Guido van Rossum]] travaille depuis 2005 au sein de cette entreprise<ref>[http://www.oreillynet.com/onlamp/blog/2005/12/python_creator_guido_van_rossu.html ''Python Creator Guido van Rossum now working at Google''], article sur ''ONLamp.com''</ref>) ; * [[Industrial Light & Magic]] ; * la [[NASA]] ; * et CCP Games, les créateurs du [[jeu vidéo]] [[EVE Online]]. == Implémentations == Outre l'implémentation de référence, nommée [[CPython]] (car écrite en langage [[C (langage)|C]]), il existe d'autres systèmes implémentant le langage Python : * [[Stackless Python]], une version de CPython n'utilisant pas la pile d'appel du langage [[C (langage)|C]] ; * [[Jython]], un [[Interprète (informatique)|interprète]] Python pour [[machine virtuelle Java]]. Il a accès aux bibliothèques fournies avec l'[[environnement de développement]] [[Java (langage)|Java]] ; * [[IronPython]], un interprète / compilateur (expérimental) pour plateforme [[Microsoft .NET|.Net]] / [[Mono (informatique)|Mono]] ; * [[PyPy]] un [[Interprète (informatique)|interprète]] Python écrit dans un sous-ensemble de Python compilable vers le [[langage C|C]] ou [[LLVM]] ; * un [[compilateur]] (expérimental) pour [[Parrot]], la machine virtuelle de [[Perl (langage)|Perl]] 6 ; * [http://www.voidspace.org.uk/python/movpy/ Movable Python] (payant) : Python sur une clef [[USB]] pour lancer des scripts sans installer Python. Ces autres implémentations ne bénéficient pas forcément de la totalité de la bibliothèque de fonctions écrites en [[C (langage)|C]] pour l'implémentation de référence. ===Plates-formes supportées par CPython=== CPython fonctionne sur un très grand nombre de [[plate-forme]]s : {| |----- valign="top" | width="25%" | '''Compatible UNIX''' * [[AIX]] * [[Berkeley Software Distribution|BSD]] * [[FreeBSD]] * [[NetBSD]] * [[Linux]] * [[OpenBSD]] * [[SPARC]] [[Solaris (informatique)|Solaris]] * autres, ex. [[Irix]] | width="25%" | '''OS bureautique''' * [[Amiga]] * [[AROS]] * [[BeOS]] * [[Mac OS 9]] * [[Mac OS X]] * [[Microsoft Windows]] * [[OS/2]] * [[RISC OS]] (précédemment Acorn) | width="25%" | '''Embarqué ou spécifique''' * [[GP2X]] * [[Java virtual machine|Java VM]] * [[Nintendo DS]] * [[Nokia N770 Internet Tablet]] * [[Nokia N800 Internet Tablet]] * [[Palm OS]] * [[PlayStation 2]] * [[PlayStation Portable]] * [[Psion]] * [[QNX]] * [[Sharp Zaurus]] * [[Symbian OS]] * [[Windows CE]]/[[Pocket PC]] * [[Xbox]]/[[xbmc|XBMC]] * [[VxWorks]] | width="25%" | '''Autres''' * [[OS/400]] * [[OS/390]] * [[Plan 9]] * [[Virtual Memory System|VMS]] * [[z/OS]] |} === Historique des versions de Python === {| class="wikitable sortable" ! Version !! Date de sortie !!class="unsortable"| Nouveautés |- || 3 || prévue pour [[août]] [[2008]] || * Fusion des types 'int' et 'long' * Les chaînes sont en Unicode par défaut, 'bytes' remplace l'ancien type 'str' * Utilise des itérateurs plutôt que des listes là où c'est approprié (ex : dict.keys()) * a/b est la vraie division par défaut * exec et print deviennent des fonctions * None et as deviennent des mots clé * Le fichier __init__.py n'est plus nécessaire pour les modules Python * `x`, l'opérateur <>, et la méthode find() des chaînes disparaissent * De nombreuses fonctions disparaissent : apply(), buffer(), callable(), ... * map() et filter() disparaissent au profit des compréhensions de liste * reduce() disparaît au profit des boucles explicites ''Voir la [http://www.python.org/dev/peps/pep-3100/ PEP 3100] pour les détails'' |- || 2.5 || [[19 septembre]] [[2006]] || * Ajout de l'opérateur '''with''' * Ajout des méthodes send(), throw() et close() aux générateurs * Expression conditionnelle (a if test else b) * Les imports de module peuvent être relatifs * Ajout des méthodes partition() et rpartition() aux chaînes str et unicode * Ajout des fonctions any() et all() * Intégration des bibliothèques ctypes, ElementTree, hashlib, sqlite3 et wsgiref |- || 2.4 || [[30 novembre]] [[2004]] || * Ajout des décorateurs de fonction/méthode (@decorateur) * Conversion automatique d'un entier court en entier long si le résultat d'une opération est trop grand * Expressions de générateur retournant les résultats l'un après l'autre et non pas sous forme d'une liste, exemple : sum( x for x in xrange(10000) ) * Ajout des fonctions reversed() et sorted() * La fonction sort() accepte les mots clés cmp, key et reverse * Création du module decimal et du routeur |- || 2.3 || [[29 juillet]] [[2003]] || * Ajout des fonctions enumerate() et sum() * Le type [[Algèbre de Boole (logique)|bool]] est maintenant vraiment distinct d'un entier * Beaucoup d'améliorations du support [[Unicode]] |- || 2.2 || [[21 décembre]] 2001 || * Unification de Type et de Class: on peut maintenant hériter des types de base * Ajout des [[Itérateur (motif de conception)|itérateurs]] et [[Générateur (informatique)|générateurs]] * Nouvel opérateur a // b pour la division entière |- || 2.1 || [[17 avril]] 2001 || * Création du module __future__ pour rendre les transitions plus douces * Comparaisons riches (méthodes __lt__, __le__, ..., __ne__) * Framework d'avertissement * Ajout des modules [[Introspection (informatique)|inspect]], [[Commentaire (informatique)|pydoc]], [[Méthode agile|doctest]], [[Test unitaire|pyunit]] * Ajout des références faibles (''weak references'') * Les fonctions peuvent avoir des attributs * "''Nested Scopes''" * La version 2.0.1 ([[juin]] 2001) sera la première version compatible [[Licence publique générale GNU|GPL]] |- || 2.0 || [[16 octobre]] [[2000]] || * Changement majeur : support d'Unicode * Ajout des compréhensions de liste (''List Comprehensions'') * Ajouts des opérateurs avec assignement (a+=b, a*=b, etc.) * Les chaînes str ont maintenant des méthodes * Nouveau [[Ramasse-miettes|ramasse-miettes à cycles]] * Nouveau prototype "def f(*args, **kw)" pour les fonctions, avant il fallait utiliser apply() * Ajout des modules distutils, xml.dom.minidom module et xml.sax |- || 1.6 || [[5 septembre]] 2000 || * La méthode append() des listes n'accepte plus qu'un seul argument * Le résultat des fonctions str() et repr() est maintenant beaucoup plus souvent différent, exemple : str(1L)=='1' et repr(1L)=='1L' * Les chaînes de caractères ont maintenant des méthodes (" abc ".strip()) * Le module re est compatible avec l'ancien moteur, est plus rapide, et accepte les chaînes Unicode * Ajout du module distutils * Nouveau prototype "def f(*args, **kw)" pour les fonctions, avant il fallait utiliser apply() * int() et long() acceptent maintenant une base en second argument * L'opérateur in peut être surchagé avec une méthode __contains__() |- || 1.5(.2) || [[13 avril]] [[1999]] || * Ajout du mot clé '''assert''' * Possibilité d'importer une hierarchie de modules (import spam.ham.eggs) * Nouveau module [[Expression rationnelle|re]] qui remplace regex * Les exceptions sont maintenant des classes * Ajout de l'option -O qui supprime les assertions et informations de ligne de fichier |} == Développement == ===Les PEP=== Les Proposition d'Amélioration de Python (ou "PEP", ''Python Enhancement Proposal'') sont des documents textuels qui ont pour objet d'être la voie d'amélioration de Python et de précéder à toutes ses modifications ultérieures. Un pep est une proposition d'orientation pour le développement (''process PEP''), une proposition technique (Standard Track PEP) ou une simple recommandation (''Informational PEP'', la plus célèbre étant certainement celle de Tim Peters : http://www.python.org/dev/peps/pep-0020/) . À leur sortie, les PEPs sont relus et commentés par le BDFL<ref>[http://www.python.org/doc/essays/pepparade.html Parade of the PEPs<!-- Titre généré automatiquement -->]</ref>. ===Python 3000=== Il existe des plans pour une future version, appelée Python 3.0 (le projet est appelé "Python 3000" ou "Py3K") qui, à terme, abolira la compatibilité descendante avec la série des versions 2.x, dans le but d'éliminer les faiblesses actuelles du langage. La ligne de conduite est de "réduire la redondance dans le fonctionnement de python par la suppression des méthodes obsolètes". Il n'y a pas de version définitive pour Python 3.0, mais Python 3.0a1, la première version alpha, a été publiée le 31 Août 2007<ref name="autogenerated1">[http://python.org/download/releases/3.0/ Python 3.0a3 Release<!-- Titre généré automatiquement -->]</ref>, et il existe un PEP<ref>[http://www.python.org/peps/pep-3000.html PEP 3000 - Python 3000<!-- Titre généré automatiquement -->]</ref> qui détaille les changements prévus. ===Philosophie=== Python 3.0 a été développé avec la même philosophie que dans ses versions antérieures, donc toute référence à la philosophie de Python s'appliquera aussi bien à la version 3.0. Comme toujours, Python a accumulé beaucoup de nouvelles méthodes qui font en fait acte de redondance avec d'autres préexistantes. Python 3.0 , en recherchant la suppression du code redondant et des modules semblables, suit la grande directive philosophique de Python "Il ne devrait subsister qu'une seule méthode, qui soit à la fois optimale '''et''' naturelle pour chaque chose". En dépit de cela, Python 3.0 restera un langage multi-paradigme. Les programmeurs auront encore le choix entre l'orientation objet, la programmation structurée, la programmation fonctionnelle, et l'aspect orienté-objet, et d'autres paradigmes ; en dépit du choix existant, Python 3.0 a cependant pour but d'être utilisé de manière plus naturelle que dans les version 2.x. ===Planning et Compatibilité=== Python 3.0a1, la première version alpha de Python 3.0, a été publiée le 31 Août 2007.<ref name="autogenerated1" /> Une version finale est, depuis Novembre 2007, prévue pour Août 2008. Les version 2.x et 3.x de Python seront publiées en parallèle pendant plusieurs cycles de développement, pendant lesquels la série des 2.x subsistera principalement pour la compatibilité, en incluant quelques caractéristiques importées depuis Python 2.3. Le [http://www.python.org/dev/peps/pep-3000/ PEP 3000] contient plus d'informations à propos du processus de publication d'une version. Comme [[Perl 6]], Python 3.0 va rompre la compatibilité descendante (rétro-compatibilité). L'utilisation de code écrit pour les séries 2.x n'est pas garanti avec Python 3.0. Il y aura des changements fondamentaux, comme le passage généralisé à l'unicode pour les chaînes de caractères. Le typage dynamique associé certaines méthodes sur les objets de type dictionnaire font qu'une transition parfaite de Python 2.x vers Python 3.0 est très difficile. Comme toujours, Un outil nommé "2to3" sera censé réaliser la plus grande part du travail de traduction, en indiquant les zones de codes sujettes à caution par des commentaires spéciaux et des Warnings. De plus, dans sa pré-version, 2to3 semble réussir franchement à réaliser une traduction correcte. <ref>Sam Ruby, [http://intertwingly.net/blog/2007/09/01/2to3 2to3], 1er septembre 2007</ref> Dans le cadre d'une migration de python 2.x vers Python 3.x, le [http://www.python.org/dev/peps/pep-3000/ PEP 3000] recommande de conserver le code original comme base des modifications et de le ''traduire'' pour la plateforme 3.x en utilisant 2to3. Python 2.6 devra fournir des caractéristiques de compatibilité ascendante, aussi bien qu'un mode "Warnings" qui devrait faire prendre conscience des problèmes potentiels de transition pour le passage à Python 3.0. (voir [http://www.python.org/dev/peps/pep-0361/ PEP 361] pour plus d'informations.) == Voir aussi == {{Wikilivres|Le langage de programmation Python}} {{Commonscat|Python (programming language)|Python}} === Articles connexes === * [[Afpy|Association Francophone Python]] * [[Python Software Foundation License]] * {{en}} [[w:IPython|IPython]] * [[Pygame]] === Liens externes === * {{en}} [http://www.python.org Site officiel] * {{fr}} {{dmoz|Python|http://www.dmoz.org/World/Français/Informatique/Programmation/Langages/Python/}} * {{en}} [http://docs.python.org/tut/ Tutoriel de Guido van Rossum] <!-- /!\ si votre site n'est pas officiel, veuillez le rajouter uniquement dans DMOZ, pas ici /!\ --> == Notes et références == {{reflist}} {{Langages de programmation 2}} {{Portail | Informatique | Logiciels libres | programmation informatique}} {{Lien BA|de}} {{Lien AdQ|ru}} {{lien BA|en}} [[Catégorie:Python|*]] [[Catégorie:Langage impératif]] [[Catégorie:Langage fonctionnel]] [[Catégorie:Langage orienté objet]] [[Catégorie:Langage de script]] [[Catégorie:Bibliothèque Python]] [[an:Python]] [[ar:بايثون]] [[az:Python]] [[bg:Python]] [[bs:Python programski jezik]] [[bug:Python]] [[ca:Python]] [[cs:Python]] [[da:Python (programmeringssprog)]] [[de:Python (Programmiersprache)]] [[el:Python]] [[en:Python (programming language)]] [[eo:Python (programlingvo)]] [[es:Python]] [[eu:Python]] [[fa:زبان برنامه‌نویسی پایتون]] [[fi:Python]] [[gl:Python]] [[he:Python]] [[hu:Python (programozási nyelv)]] [[is:Python (forritunarmál)]] [[it:Python]] [[ja:Python]] [[ka:პითონი (პროგრამირების ენა)]] [[ko:파이썬]] [[la:Python]] [[lt:Python]] [[ml:പൈത്തണ്‍]] [[ms:Python]] [[nl:Python (programmeertaal)]] [[no:Python]] [[pl:Python]] [[pt:Python]] [[ro:Python]] [[ru:Python]] [[simple:Python (programming language)]] [[sk:Python (programovací jazyk)]] [[sl:Python (programski jezik)]] [[sq:Python]] [[sr:Програмски језик Пајтон]] [[sv:Python (programspråk)]] [[te:పైథాన్ (కంప్యూటర్ భాష)]] [[th:ภาษาไพทอน]] [[tr:Python Programlama Dili]] [[uk:Python]] [[vi:Python (ngôn ngữ lập trình)]] [[zh:Python]]