From 0262e7670d638e98db2e0aee34592612522da980 Mon Sep 17 00:00:00 2001 From: Sinma Date: Sat, 6 Jul 2013 22:37:39 +0200 Subject: [PATCH 01/24] =?UTF-8?q?R=C3=A9organisation=20de=20=C2=ABPrincipe?= =?UTF-8?q?s=20de=20fonctionnement=C2=BB=20et=20simplification=20de=20la?= =?UTF-8?q?=20pr=C3=A9sentation=20des=20commandes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dans la partie «Principes de fonctionnement», j’ai placé le texte explicatif avant la description pour les deux derniers points de la liste. J’ai aussi supprimé ce qu’il y avait avant le $ pour les lignes de commandes, ça risque moins de provoquer la confusion (moi-même je n’ai pas compris tout de suite) --- README.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3c0992a3..1a22440f 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,14 @@ Les principes sont assez simples : Dans les deux cas, cela revient au même : vous disposez localement d'un dépôt sur lequel vous allez pouvoir travailler. * Travailler sur votre dépôt. - * Versionner vos modifications -> Créer un commit. Une fois satisfait de votre modification ou de votre ajout, vous pouvez versionner vos modifications. En langage Git, on parle de commit. Ce commit crée une nouvelle version du fichier. S'il s'agit d'un nouveau fichier, ce sera la première version. - * Publier vos modifications. - + * Versionner vos modifications → Créer un commit. + Vos commits sont dans votre dépôt local. Vous avez alors la possibilité de les publier vers le dépôt initial ou même vers un autre dépôt. En langage Git, on parle de push. Si vous ne disposez pas des droit de publication sur dépôt distant, vous pouvez aussi proposer vos modifications au responsable du dépôt. En langage Git on parle de pull request. + + * Publier vos modifications. En résumé, vous créez un dépôt local, vous travaillez, vous committez et vous publiez. Facile, non ? @@ -48,7 +49,7 @@ En résumé, vous créez un dépôt local, vous travaillez, vous committez et vo Concrètement, voici ce que ça donne pour ce projet. Commençons pas cloner joyeusement le projet. Dans votre dossier personnel, placez vous à l'endroit où vous souhaitez créer votre dépôt local puis exécutez la commande de clonage ```bash -git clone https://github.com/framasoft/plongez-dans-python3.git +$git clone https://github.com/framasoft/plongez-dans-python3.git ``` Vous devriez obtenir le résultat suivant. Vous remarquerez que cette opération crée automatiquement un dossier dans lequel figurera votre dépôt : @@ -65,7 +66,7 @@ Resolving deltas: 100% (1587/1587), done. Faites une modification. Vous pouvez obtenir à tout moment le statut de votre dépôt : ```bash -Blake:plongez-dans-python3 gcoulais$ git status +$ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) @@ -89,8 +90,8 @@ Ici un fichier README.md a été ajouté mais n'a pas encore été committé. Gi Ajoutons maintenant le fichier au suivi de version et committons. L'opération se déroule donc en deux fois : add puis commit. Un commit est toujours accompagné d'un message expliquant ce que vous avez fait. ```bash -Blake:plongez-dans-python3 gcoulais$ git add README.md -Blake:plongez-dans-python3 gcoulais$ git commit -m "Ajout du README.md" +$ git add README.md +$ git commit -m "Ajout du README.md" [master 2c53431] Ajout du README.md 1 file changed, 80 insertions(+) create mode 100644 README.md @@ -99,7 +100,7 @@ Blake:plongez-dans-python3 gcoulais$ git commit -m "Ajout du README.md" Il ne reste plus qu'à publier la modification sur le dépôt distant : ```bash -Blake:plongez-dans-python3 gcoulais$ git push origin master +$ git push origin master Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. @@ -114,7 +115,7 @@ To https://github.com/framasoft/plongez-dans-python3.git Effectivement, d'autres que vous travaillent sur cette traduction. Il faut donc que vous puissiez récupérer leurs modifications. Encore une fois, c'est un jeu d'enfant. Placez vous simplement dans votre dépôt et magie : ```bash -Blake:plongez-dans-python3 gcoulais$ git pull origin master +$ git pull origin master From https://github.com/framasoft/plongez-dans-python3 * branch master -> FETCH_HEAD Already up-to-date. @@ -123,7 +124,7 @@ Already up-to-date. Ici ce n'est pas très parlant : le dépôt local était déjà à jour. Mais c'est bien là que vous verrez apparaître toutes les modifications de vos petits camarades. Attention, si vous avez des modifications en cours, Git refusera de faire l'opération de pull. Il suffit de mettre de côté vos modifications, de récupérer la dernière version du dépôt distant puis d'y appliquer vos modifications en cours. En langage git, ça donne ça : ```bash -Blake:plongez-dans-python3 gcoulais$ git stash +$ git stash Saved working directory and index state WIP on master: 7583460 README : coloration syntaxique pour les blocs de code HEAD is now at 7583460 README : coloration syntaxique pour les blocs de code ``` @@ -131,13 +132,13 @@ HEAD is now at 7583460 README : coloration syntaxique pour les blocs de code puis ```bash -Blake:plongez-dans-python3 gcoulais$ git pull origin master +$ git pull origin master ``` et enfin ```bash -Blake:plongez-dans-python3 gcoulais$ git stash apply +$ git stash apply # On branch master # Changes not staged for commit: # (use "git add ..." to update what will be committed) @@ -154,5 +155,3 @@ no changes added to commit (use "git add" and/or "git commit -a") TODO: expliquer brièvement les branches. TODO: expliquer brièvement les remote. Pourquoi origin master - - From 35c2a4c061a953e0ced1f69b0ecaabc1dbb224cd Mon Sep 17 00:00:00 2001 From: Sinma Date: Sat, 6 Jul 2013 23:08:02 +0200 Subject: [PATCH 02/24] =?UTF-8?q?Correction=20d=E2=80=99espace=20ins=C3=A9?= =?UTF-8?q?cable=20(mode=20typo=20nazi)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 00-index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/00-index.html b/00-index.html index e7bf7b40..96c183ae 100644 --- a/00-index.html +++ b/00-index.html @@ -21,7 +21,7 @@
 
-

Vous êtes ici :   +

Vous êtes ici : 

Plongez dans Python 3

From dd60bc9fc192fbdc31cc99ca5cba95c2a9d49d94 Mon Sep 17 00:00:00 2001 From: Gilles Coulais Date: Sun, 7 Jul 2013 12:01:15 +0200 Subject: [PATCH 03/24] Ajouts : branches, remotes --- README.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1a22440f..56f72435 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,9 @@ TODO: expliquer le projet, comment participer, qui contacter, à quelle on mange GIT : petit guide à l'usage du débutant --------------------------------------- -Git est un système de gestion de versions décentralisé [DVCS](https://en.wikipedia.org/wiki/Distributed_revision_control). Voilà pour les gros mots. Passons maintenant à quelque chose de compréhensible pour l'humain courant. +Git est un système de gestion de versions décentralisé [DVCS](https://en.wikipedia.org/wiki/Distributed_revision_control). Voilà pour les gros mots. + +Passons maintenant à quelque chose de compréhensible pour l'humain courant. Ce guide doit vous mettre le pied à l'étrier du projet de traduction de Dive Into Python 3. ### Git : kesako ? @@ -17,7 +19,7 @@ Git permet de gérer des versions de fichiers. Grâce à Git, on sait qui a fait ### Je n'y connais rien. Que fais je ? -Eh bien vous apprenez. Pas de panique : inutile d'avoir fait Polytechnique. La courbe d'apprentissage des commandes de base est très rapide. +Eh bien vous apprenez. Pas de panique : inutile d'avoir fait Polytechnique. La courbe d'apprentissage des commandes de base est très rapide. Vous allez apprendre comment fonctionne Git avec des explications pour être humain et comment utiliser les commandes de base de Git : clone, pull, push, log, commit, branch, status... #### Installation @@ -129,13 +131,13 @@ Saved working directory and index state WIP on master: 7583460 README : colorati HEAD is now at 7583460 README : coloration syntaxique pour les blocs de code ``` -puis +puis : ```bash $ git pull origin master ``` -et enfin +et enfin : ```bash $ git stash apply @@ -151,7 +153,85 @@ no changes added to commit (use "git add" and/or "git commit -a") #### Origin master : c'est quoi cette bouteille de lait ? -#### À propos des branches +Lors des opérations de récupératio (pull) et publication (push), vous avez utilisé des choses inconnues : origin master. Tout d'abord, c'est dangereux d'exécuter une commande sans savoir ce qu'elle fait :) . Bon, ici aucun chaton n'a été tué, l'honneur est sauf. Mais alors qu'est ce que c'est que ce 'origin master' ? + +Votre dépôt local est autonome. Vous pouvez n'utiliser que lui et ne jamais rien publier. Mais si vous souhaitez contribuer à un autre dépôt, il y a un moment où votre votre dépôt local doit connaitre un plusieurs dépôts externes vers lesquels il pourra publier ou desquels il pourra récupérer des mise à jour. En langage Git, cela s'appelle un remote. Un remote est un dépôt distant qui est associé au votre. + +Par ailleurs, votre dépôt local peut être associé à plusieurs remotes. Il faut donc un moyen de différencier ces remotes. Ils sont donc nommés. + +Enfin, un remote contient au moins une branche, il faut donc pouvoir identifier la branche distante avec laquelle vous souhaitez communiquer. Comment ça vous ne savez pas ce qu'est une branche ? Un peu de patience, ça vient. + +Pour en revenir à ce qui nous intéresse, origin est donc un dépôt distant et master une branche dans ce dépôt. La magie, c'est que vous n'avez rien fait pour créer ou nommer ce remote. En fait, Git l'a fait tout seul comme un grand lorsque vous avez cloné le dépôt. Vous pouvez voir les dépôts auxquels vous être abonnés avec une simple commande : + +```bash +$ git remote -v +origin git@github.com:framasoft/plongez-dans-python3.git (fetch) +origin git@github.com:framasoft/plongez-dans-python3.git (push) +no changes added to commit (use "git add" and/or "git commit -a") +``` + +Il y a beaucoup de choses que l'on peut faire avec les remotes. Il y a cependant de grandes chances que cette simple commande vous soit suffisante dans le cadre de ce projet. + +#### Jardinons un peu : les branches + +Pour en terminer avec ce petit voyage au pays de Git, soyons un peu bucoliques. Lorsque vous créez ou clonez un dépôt, Git crée une branche par défaut appelée master. Une branche est une sorte de copie du dépôt (en fait Git ne copie pas vraiment les données, mais nous n'irons pas aussi loin). Vous pouvez alors travailler sur cette copie sans impacter les autres branches : toute ce qui est committé dans cette nouvelle branche n'apparaîtra pas dans les autres. Si au final vous êtes satisfaits de votre travail, il ne vous reste plus qu'à commiter vos modifications dans cette branche puis à les rapatrier dans la branche master. En langage Git, on parle de merge. Mais vous pouvez aussi ne pas être content de ce que vous avez fait et ne pas vouloir conserver ces modifications. Il suffit de les committer puis de supprimer la nouvelle branche. + +Pour connaitre la liste des branches de votre dépôt local : + +```bash +$ git branch +* master +``` + +Pour créer une nouvelle branche : + +```bash +$ git branch maNouvelleBranche +$ git branch + maNouvelleBranche +* master +``` + +L'astérisque vous indique le dépôt sur lequel vous travaillez. Changeons de branche pour travailler sur maNouvelleBranche : + +```bash +$ git checkout maNouvelleBranche +M README.md +Switched to branch 'maNouvelleBranche' +gilles@Arctica:~/Developpement/Python/DiveIntoPython3$ git branch +* maNouvelleBranche + master +``` + +L'astérisque vous montre que vous êtes désormais sur la branche maNouvelleBranche. + +#### Faites le petit chef : lister les commits + +Dans votre activité professionnelle, vous avez sûrement un (petit) chef qui vient vous voir 20 fois par jour en vous disant "Alors, t'en es où ?". Oui, c'est énervant. + +Mais Git est un gars calme et posé qui répondra toujours à vos sollicitations. Alors n'hésitez pas à faire le chef : + +```bash +$ git log +commit 35c2a4c061a953e0ced1f69b0ecaabc1dbb224cd +Author: Sinma +Date: Sat Jul 6 23:08:02 2013 +0200 + + Correction d’espace insécable (mode typo nazi) + +commit 0262e7670d638e98db2e0aee34592612522da980 +Author: Sinma +Date: Sat Jul 6 22:37:39 2013 +0200 + + Réorganisation de «Principes de fonctionnement» et simplification de la présentation des commandes + + Dans la partie «Principes de fonctionnement», j’ai placé le texte explicatif avant la description pour les deux derniers points de la liste. + + J’ai aussi supprimé ce qu’il y avait avant le $ pour les lignes de commandes, ça risque moins de provoquer la confusion (moi-même je n’ai pas comp + +commit f38a3530decc51c6ec72163f9595387409e506af +[...] +``` +Vous pouvez naviguer dans l'historique des commits avec les flèches haut et bas de votre clavier. Quittez avec q. -TODO: expliquer brièvement les branches. -TODO: expliquer brièvement les remote. Pourquoi origin master +Vous avez désormais les armes pour démarrer. Il y a énormément d'autres choses que vous pouvez faire avec Git mais ce n'est pas l'objet de ce tutoriel. Pour savoir comment faire telle ou telle chose, vous pouvez consulter le [Git Book](http://git-scm.com/book/fr/) ou solliciter la [liste de discussion](http://www.framalistes.org/sympa/info/plongez-dans-python-3). From 8310f17516b2e692bdee0773370190cee1b758f7 Mon Sep 17 00:00:00 2001 From: Sinma Date: Thu, 11 Jul 2013 15:31:39 +0200 Subject: [PATCH 04/24] =?UTF-8?q?Ajout=20d=E2=80=99une=20espace=20dans=20l?= =?UTF-8?q?e=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La correction la plus nulle du monde --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 56f72435..d1da3ab7 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ En résumé, vous créez un dépôt local, vous travaillez, vous committez et vo Concrètement, voici ce que ça donne pour ce projet. Commençons pas cloner joyeusement le projet. Dans votre dossier personnel, placez vous à l'endroit où vous souhaitez créer votre dépôt local puis exécutez la commande de clonage ```bash -$git clone https://github.com/framasoft/plongez-dans-python3.git +$ git clone https://github.com/framasoft/plongez-dans-python3.git ``` Vous devriez obtenir le résultat suivant. Vous remarquerez que cette opération crée automatiquement un dossier dans lequel figurera votre dépôt : From 5a0e62d67152b3482a5defa6772b6774b3d2f2e6 Mon Sep 17 00:00:00 2001 From: audionuma Date: Sun, 14 Jul 2013 08:01:15 +0200 Subject: [PATCH 05/24] =?UTF-8?q?D=C3=A9but=20trad=20chapitre=20native=20d?= =?UTF-8?q?atatypes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03-native-datatypes.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03-native-datatypes.html b/03-native-datatypes.html index 82421bfc..4f113584 100755 --- a/03-native-datatypes.html +++ b/03-native-datatypes.html @@ -1,6 +1,6 @@ --- title: Les types prédéfinis -status: Non traduit +status: En cours permalink: native-datatypes.html --- From c72a032cc624bc81e272a7134d735d263e5ab79d Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Sun, 14 Jul 2013 11:56:08 +0200 Subject: [PATCH 06/24] Update 01-installing-python.html MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Passage à en relecture --- 01-installing-python.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-installing-python.html b/01-installing-python.html index 3c6134a4..e2e41fc2 100755 --- a/01-installing-python.html +++ b/01-installing-python.html @@ -1,6 +1,6 @@ --- title: Installer Python -status: Non traduit +status: Relecture permalink: installing-python.html --- From cf5ceecd2ee0cd4fc04fd4a3d66f72dafc13bf2a Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Sun, 14 Jul 2013 12:13:40 +0200 Subject: [PATCH 07/24] Ajout du wokflow dans le README --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d1da3ab7..b5d6b71a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,25 @@ Dive Into Python 3 Projet de traduction fr ----------------------- -TODO: expliquer le projet, comment participer, qui contacter, à quelle on mange, pourquoi les escargots n'ont pas de dents... +TODO: expliquer le projet, à quelle heure on mange, pourquoi les escargots n'ont pas de dents… + +Comment participer ? +-------------------- + +Pour discuter, on a une mailing-list : plongez-dans-python-3@framalistes.org. Inscrivez-vous sur [http://www.framalistes.org/sympa/subscribe/plongez-dans-python-3](http://www.framalistes.org/sympa/subscribe/plongez-dans-python-3). + +Ensuite, il faut nous envoyer un petit mail sur cette liste en nous donnant votre pseudo github, qu'on vous ajoute au groupe qui a les droits sur ce dépôt, histoire de pouvoir bosser. + +La façon de travailler est assez simple, mais il est primordial de s'y tenir, sinon ça va être le gros bazar. +1. Passer le statut à "En cours" dans l'en-tête du fichier que vous allez traduire, dans la branche master. +2. Pousser cette modification (ou la refaire) dans la branche gh-pages. +3. Créer, à partir de la branche master, une nouvelle branche portant le nom du fichier à traduire. +4. Traduire. +5. Passer le statut du fichier à "Relecture" dans la branche du fichier, la branche master et la branche gh-pages +6. Faire une pull-request pour pousser la branche du fichier dans la branche master +7. Relecture par les autres membres de l'équipe, quand ils sont ok pour pousser, ils mettent un :1 dans les commentaires de la pull-request +8. Quand on a 4 ou 5 :1 dans les commentaires, le coordinateur (ldidry) pousse dans master, update le statut à "Publié" dans les branches master et gh-pages. +9. goto 1 GIT : petit guide à l'usage du débutant --------------------------------------- From 5c0a2ebf096d44284da4abb3d7d2058bfcf1da91 Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Sun, 14 Jul 2013 12:15:51 +0200 Subject: [PATCH 08/24] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ça m'apprendra à pas faire d'aperçu avant de commiter --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b5d6b71a..7c7a8404 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,14 @@ Pour discuter, on a une mailing-list : plongez-dans-python-3@framalistes.org. In Ensuite, il faut nous envoyer un petit mail sur cette liste en nous donnant votre pseudo github, qu'on vous ajoute au groupe qui a les droits sur ce dépôt, histoire de pouvoir bosser. La façon de travailler est assez simple, mais il est primordial de s'y tenir, sinon ça va être le gros bazar. + 1. Passer le statut à "En cours" dans l'en-tête du fichier que vous allez traduire, dans la branche master. 2. Pousser cette modification (ou la refaire) dans la branche gh-pages. 3. Créer, à partir de la branche master, une nouvelle branche portant le nom du fichier à traduire. 4. Traduire. 5. Passer le statut du fichier à "Relecture" dans la branche du fichier, la branche master et la branche gh-pages 6. Faire une pull-request pour pousser la branche du fichier dans la branche master -7. Relecture par les autres membres de l'équipe, quand ils sont ok pour pousser, ils mettent un :1 dans les commentaires de la pull-request +7. Relecture par les autres membres de l'équipe, quand ils sont ok pour pousser, ils mettent un :1 (émoticône pouce vers le haut de github) dans les commentaires de la pull-request 8. Quand on a 4 ou 5 :1 dans les commentaires, le coordinateur (ldidry) pousse dans master, update le statut à "Publié" dans les branches master et gh-pages. 9. goto 1 From 2a210056b9d8b6684966aa573e4c437f1a8bfaf6 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 14 Jul 2013 13:44:08 +0200 Subject: [PATCH 09/24] Marquage du chapitre 2 en 'En cours'. --- 02-your-first-python-program.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/02-your-first-python-program.html b/02-your-first-python-program.html index 1fbe5282..8e0e40a7 100755 --- a/02-your-first-python-program.html +++ b/02-your-first-python-program.html @@ -1,6 +1,6 @@ --- title: Votre premier programme en Python -status: Non traduit +status: En cours permalink: your-first-python-program.html --- From 47bb4b4087a63d636f7e10afa71b19f7e88251f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chauvel?= Date: Sun, 14 Jul 2013 16:26:06 +0200 Subject: [PATCH 10/24] =?UTF-8?q?Quoi=20de=20neuf=20dans=20=E2=80=9CPlonge?= =?UTF-8?q?z=20dans=20Python=203=E2=80=9D=20pass=C3=A9=20en=20statut=20?= =?UTF-8?q?=C2=ABEn=20cours=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 00-whats-new.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/00-whats-new.html b/00-whats-new.html index 24417aa4..5e7952bf 100644 --- a/00-whats-new.html +++ b/00-whats-new.html @@ -1,6 +1,6 @@ --- title: Quoi de neuf dans “Plongez dans Python 3” -status: Non traduit +status: En cours permalink: whats-new.html --- From 1a840f3e65ea75de23008877bc8c49dc4454d79f Mon Sep 17 00:00:00 2001 From: shan-x Date: Sun, 14 Jul 2013 16:47:45 +0200 Subject: [PATCH 11/24] Changement de statut Traduction en cours --- 07-generators.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/07-generators.html b/07-generators.html index da49fce5..281e2d69 100755 --- a/07-generators.html +++ b/07-generators.html @@ -1,6 +1,6 @@ --- title: Fermetures & Générateurs -status: Non traduit +status: En cours permalink: generators.html --- From 7691cc63e965e5012302fcd38cca8f944f5f2e9a Mon Sep 17 00:00:00 2001 From: Gatien Bovyn Date: Sun, 14 Jul 2013 17:22:19 +0200 Subject: [PATCH 12/24] Changement de status pour 05-strings.html --- 05-strings.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/05-strings.html b/05-strings.html index 619fc3d2..c286a0a8 100755 --- a/05-strings.html +++ b/05-strings.html @@ -1,6 +1,6 @@ --- title: Chaînes de caractères -status: Non traduit +status: En cours permalink: string.html --- From 315518369f74fc1b28ce6225a495de8ce9d44f4b Mon Sep 17 00:00:00 2001 From: Julien Tanguy Date: Sun, 14 Jul 2013 17:42:14 +0200 Subject: [PATCH 13/24] Correction typo permalink chap 16 --- 16-case-study-porting-chardet-to-python-3.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16-case-study-porting-chardet-to-python-3.html b/16-case-study-porting-chardet-to-python-3.html index 7ea80ba0..b6ca2889 100755 --- a/16-case-study-porting-chardet-to-python-3.html +++ b/16-case-study-porting-chardet-to-python-3.html @@ -1,7 +1,7 @@ --- title: Étude de cas : Le portage de chardet vers Python 3 status: Non traduit -permalink: case-study-porting-to-python-3.html +permalink: case-study-porting-chardet-to-python-3.html --- From 3191d8705a728e9bdd7dd99559d839c9e21b5cc3 Mon Sep 17 00:00:00 2001 From: Julien Tanguy Date: Sun, 14 Jul 2013 18:30:09 +0200 Subject: [PATCH 14/24] Supression du : dans le titre du chap 15 --- 16-case-study-porting-chardet-to-python-3.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16-case-study-porting-chardet-to-python-3.html b/16-case-study-porting-chardet-to-python-3.html index b6ca2889..46373073 100755 --- a/16-case-study-porting-chardet-to-python-3.html +++ b/16-case-study-porting-chardet-to-python-3.html @@ -1,5 +1,5 @@ --- -title: Étude de cas : Le portage de chardet vers Python 3 +title: Étude de cas - Le portage de chardet vers Python 3 status: Non traduit permalink: case-study-porting-chardet-to-python-3.html --- From 385799f973ecba64303f4b5b80c2da632db36972 Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Sun, 14 Jul 2013 18:39:07 +0200 Subject: [PATCH 15/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c7a8404..bbfb6fa8 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ La façon de travailler est assez simple, mais il est primordial de s'y tenir, s 4. Traduire. 5. Passer le statut du fichier à "Relecture" dans la branche du fichier, la branche master et la branche gh-pages 6. Faire une pull-request pour pousser la branche du fichier dans la branche master -7. Relecture par les autres membres de l'équipe, quand ils sont ok pour pousser, ils mettent un :1 (émoticône pouce vers le haut de github) dans les commentaires de la pull-request -8. Quand on a 4 ou 5 :1 dans les commentaires, le coordinateur (ldidry) pousse dans master, update le statut à "Publié" dans les branches master et gh-pages. +7. Relecture par les autres membres de l'équipe, quand ils sont ok pour pousser, ils mettent un :+1: (émoticône pouce vers le haut de github) dans les commentaires de la pull-request +8. Quand on a 4 ou 5 :+1: dans les commentaires, le coordinateur (ldidry) pousse dans master, update le statut à "Publié" dans les branches master et gh-pages. 9. goto 1 GIT : petit guide à l'usage du débutant From 6f891b5afeefec57ea12edaf7dc3ac29cda01b58 Mon Sep 17 00:00:00 2001 From: Gatien Bovyn Date: Mon, 15 Jul 2013 16:00:09 +0200 Subject: [PATCH 16/24] Corrections typographiques --- 00-index.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/00-index.html b/00-index.html index 96c183ae..6e3f3514 100644 --- a/00-index.html +++ b/00-index.html @@ -21,7 +21,7 @@
 
-

Vous êtes ici :  +

Vous êtes ici :

Plongez dans Python 3

@@ -29,11 +29,11 @@

Plongez dans Python 3

Table des matières (développer)

-

Aussi disponible sur des livres morts !
Plongez dans Python 3
+

Aussi disponible sur des arbres morts !
Plongez dans Python 3

    -
  1. Quoi de neuf dans “Plongez dans Python 3” +
  2. Quoi de neuf dans « Plongez dans Python 3 »
  3. Installer Python
  4. Votre premier programme en Python
  5. Types prédéfinis @@ -47,21 +47,21 @@

    Table des matières (développer)

  6. Refactorisation
  7. Fichiers
  8. XML -
  9. Sérialisation d'objets Python +
  10. Sérialisation d’objets Python
  11. Services Web HTTP -
  12. Étude de cas : Le portage de chardet vers Python 3 +
  13. Étude de cas : Le portage de chardet vers Python 3
  14. Packaging de librairies Python
  15. Porter du code vers Python 3 avec 2to3
  16. Nom des méthodes spéciales -
  17. Où aller maintenant ? +
  18. Où aller maintenant ?
  19. Troubleshooting
-

Ce livre est sous licence libre Creative Commons Attribution Share-Alike. Vous pouvez le télécharger en HTML ou PDF. Les über-geeks peuvent aussi cloner le dépôt Git : +

Ce livre est sous licence libre Creative Commons Attribution - Partage dans les Mêmes Conditions. Vous pouvez le télécharger en HTML ou PDF. Les über-geeks peuvent aussi cloner le dépôt Git :

you@localhost:~$ git clone git://github.com/diveintomark/diveintopython3.git

© 2001–11 Mark Pilgrim -

Traductions : en español, in italiano, на русском языке, به پارسی, česky +

Traductions : en español, in italiano, на русском языке, به پارسی, česky From 1d668cbe90e03397fc3f8ab3ba54f73a29bd1dd1 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Wed, 17 Jul 2013 12:37:53 +0200 Subject: [PATCH 17/24] Marquage du chapitre 4 en 'En cours'. --- 04-comprehensions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/04-comprehensions.html b/04-comprehensions.html index 3d86280c..5e81f135 100644 --- a/04-comprehensions.html +++ b/04-comprehensions.html @@ -1,6 +1,6 @@ --- title: En compréhension -status: Non traduit +status: En cours permalink: comprehensions.html --- From 8a690f19f6d09dab672cd8222ed2020b2885658d Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 20 Jul 2013 17:56:50 +0200 Subject: [PATCH 18/24] Marquage du chapitre 6 en 'En cours'. --- 06-regular-expressions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/06-regular-expressions.html b/06-regular-expressions.html index d20290cd..2e3821cb 100755 --- a/06-regular-expressions.html +++ b/06-regular-expressions.html @@ -1,6 +1,6 @@ --- title: Expressions régulières -status: Non traduit +status: En cours permalink: regular-expressions.html --- From 4bb2f9e7fb421cff642db565b6a8905181cfa9b1 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 21 Jul 2013 22:54:33 +0200 Subject: [PATCH 19/24] =?UTF-8?q?D=C3=A9but=20de=20la=20traduction=20du=20?= =?UTF-8?q?chapitre=206=20(environ=20un=20cinqui=C3=A8me).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 06-regular-expressions.html | 64 ++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 32 deletions(-) mode change 100755 => 100644 06-regular-expressions.html diff --git a/06-regular-expressions.html b/06-regular-expressions.html old mode 100755 new mode 100644 index 2e3821cb..0ed75f86 --- a/06-regular-expressions.html +++ b/06-regular-expressions.html @@ -15,24 +15,24 @@

  
-

You are here: Home Dive Into Python 3 -

Difficulty level: ♦♦♦♢♢ -

Regular Expressions

+

You are here: Home Plongez dans Python 3 +

Niveau de difficulté : ♦♦♦♢♢ +

Expressions Rationnelles

-

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.
Jamie Zawinski +

Certaines personnes, lorsqu’elles ont un problème, pensent « Je sais, je vais utiliser des expressions rationnelles. » Maintenant elles ont deux problèmes − Now they have two problems.
Jamie Zawinski

  -

Diving In

-

Getting a small bit of text out of a large block of text is a challenge. In Python, strings have methods for searching and replacing: index(), find(), split(), count(), replace(), &c. But these methods are limited to the simplest of cases. For example, the index() method looks for a single, hard-coded substring, and the search is always case-sensitive. To do case-insensitive searches of a string s, you must call s.lower() or s.upper() and make sure your search strings are the appropriate case to match. The replace() and split() methods have the same limitations. -

If your goal can be accomplished with string methods, you should use them. They’re fast and simple and easy to read, and there’s a lot to be said for fast, simple, readable code. But if you find yourself using a lot of different string functions with if statements to handle special cases, or if you’re chaining calls to split() and join() to slice-and-dice your strings, you may need to move up to regular expressions. -

Regular expressions are a powerful and (mostly) standardized way of searching, replacing, and parsing text with complex patterns of characters. Although the regular expression syntax is tight and unlike normal code, the result can end up being more readable than a hand-rolled solution that uses a long chain of string functions. There are even ways of embedding comments within regular expressions, so you can include fine-grained documentation within them. -

-

If you’ve used regular expressions in other languages (like Perl, JavaScript, or PHP), Python’s syntax will be very familiar. Read the summary of the re module to get an overview of the available functions and their arguments. +

Plongée

+

Récupérer un petit bout de texte d’un gros bloc de texte peut relever de l’exploit. En Python, les chaines ont des méthodes pour rechercher et remplacer : index(), find(), split(), count(), replace(), etc. Mais ces méthodes sont limitées aux cas les plus simples. Par exemple, la méthode index() recherche une unique chaine prédéfinie, et la recherche est toujours sensible à la casse. Pour faire une recherche insensible à la casse d’une chaine s, vous devez appeler s.lower() ou s.upper() et vous assurer que les chaine recherchées sont dans la casse appropriée. Les méthodes replace() et split() ont les mêmes limitations. +

Si votre but peut être accompli avec les méthodes de chaine, vous devriez les utiliser. Elles sont rapides, simples, et faciles à dire ; et il y a beaucoup d’arguments en faveur d’un code rapide, simple, et lisible. Mais si vous vous trouvez dans un cas où vous devez utiliser beaucoup de méthodes de chaines avec des instructions pour gérer les cas particuliers, ou si vous enchainez les appels à split() et join() pour séparer et recoller vos chaines, vous pourriez avoir besoin d’expressions régulières. +

Les expressions rationnelles sont une façon puissante et (plutôt) standard de rechercher, remplacer, et parser du texte avec des schémas de caractères complexes. Même si la syntaxe des expressions régulière est rigoureuse et diffère du code normal, le résultat peut être au final plus lisible qu’une solution faite soi-même utilisant une longue série de fonctions de chaine. Il y a même moyen d’inclure des commentaires dans les expressions rationnelles, donc vous pouvez y inclure une documentation fine. +

Si vous avez déjà utilisé des expressions dans d’autre langages (comme Perl, Javascript, ou PHP), la syntaxe de Python vous semblera très familiaire. Lisez le sommaine du module re pour avoir un aperçu des fonctions disponibles et de leurs paramètes.

⁂ -

Case Study: Street Addresses

-

This series of examples was inspired by a real-life problem I had in my day job several years ago, when I needed to scrub and standardize street addresses exported from a legacy system before importing them into a newer system. (See, I don’t just make this stuff up; it’s actually useful.) This example shows how I approached the problem. +

Étude De Cas : Adresses Postales

+

Cette série d’exemple est inspirée d’un problème réel que j’ai eu à mon travail il y a quelques années, alors que je devais parcourir et standardiser des adresses postale d’un ancien système avant de les importer dans un nouveau. (Vous voyez, je n’invente pas tout ; c’est vraiment utile.) Cet exemple montre comment j’ai approché le problème.

 >>> s = '100 NORTH MAIN ROAD'
 >>> s.replace('ROAD', 'RD.')                
@@ -46,14 +46,14 @@ 

Case Study: Street Addresses

>>> re.sub('ROAD$', 'RD.', s) '100 NORTH BROAD RD.'
    -
  1. My goal is to standardize a street address so that 'ROAD' is always abbreviated as 'RD.'. At first glance, I thought this was simple enough that I could just use the string method replace(). After all, all the data was already uppercase, so case mismatches would not be a problem. And the search string, 'ROAD', was a constant. And in this deceptively simple example, s.replace() does indeed work. -
  2. Life, unfortunately, is full of counterexamples, and I quickly discovered this one. The problem here is that 'ROAD' appears twice in the address, once as part of the street name 'BROAD' and once as its own word. The replace() method sees these two occurrences and blindly replaces both of them; meanwhile, I see my addresses getting destroyed. -
  3. To solve the problem of addresses with more than one 'ROAD' substring, you could resort to something like this: only search and replace 'ROAD' in the last four characters of the address (s[-4:]), and leave the string alone (s[:-4]). But you can see that this is already getting unwieldy. For example, the pattern is dependent on the length of the string you’re replacing. (If you were replacing 'STREET' with 'ST.', you would need to use s[:-6] and s[-6:].replace(...).) Would you like to come back in six months and debug this? I know I wouldn’t. -
  4. It’s time to move up to regular expressions. In Python, all functionality related to regular expressions is contained in the re module. -
  5. Take a look at the first parameter: 'ROAD$'. This is a simple regular expression that matches 'ROAD' only when it occurs at the end of a string. The $ means “end of the string.” (There is a corresponding character, the caret ^, which means “beginning of the string.”) Using the re.sub() function, you search the string s for the regular expression 'ROAD$' and replace it with 'RD.'. This matches the ROAD at the end of the string s, but does not match the ROAD that’s part of the word BROAD, because that’s in the middle of s. +
  6. Mon but est de standardiser l’adresse de façon à ce que 'ROAD' soit toujours abbrégé par 'RD.'. À première vue, j'ai pensé que ce serait assez simple pour utiliser la méthode de chaine replace(). Après tout, toutes les données sont déjà en majuscules, dont les cas où ça ne correspond pas ne sont pas un problème. Et la chaine cherchée, 'ROAD', est une constante. Et dans cet exemple dramatiquement simple, s.replace() fonctionne effectivement. +
  7. La vie est malheureusmeent pleine de contrexemples. Le problème ici est que 'ROAD' apparait deux fois dans l’adresse, d’abord dans le nom de la rue, 'BROAD' puis en tant que mot en lui-même. La méthode replace() voit ces deux occurences et remplace aveuglément les deux ; pendant ce temps, je vois mes adresses se faire détruire. +
  8. Pour résoudre ce problème avec les adresses qui ont plus d’une sous-chaine 'ROAD', vous pouvez faire quelque chose comme ne remplacer 'ROAD' que dans les quatre derniers caractères de l’adresse (s[-4:]), et laisser le reste tel quel (s[:-4]). Mais vous pouvez constater que ça commence à devenir assez lourd. Par exemple, le schéma est dépendant de la longueur de la chaine que vous voulez remplacer. (Si vous voulez remplacer 'STREET' par 'ST.', vous devrez utiliser à la place s[:-6] et s[-6:].replace(...).) Voulez-vous revenir six mois plus tard et déboguer cela ? Je sais que ce n’est pas mon cas. +
  9. Il est temps de passer aux expressions rationnelles. En Python, toutes les fonctionnalités liées aux expressions rationelles sont contenues dans le module re. +
  10. Jetez un coup d’œil au premier paramètre : 'ROAD$'. C’est une expression rationnelle simple qui détecte 'ROAD' seulement lorsqu’il est à la fin d’une chaine. Le $ signifie « fin de la chaine » (Il y a un caractère correspondant, le chapeau ^, qui signifie « début de la chaine ».) En utilisant la fonction re.sub() vous recherchez l’expression rationelle 'ROAD$' dans la chaine s et la remplacez avec 'RD.'. Ceci détecte ROAD à la fin de la chaine s, mais pas me ROAD qui fait partie du mot BROAD, car il est au milieu de s.
- -

Continuing with my story of scrubbing addresses, I soon discovered that the previous example, matching 'ROAD' at the end of the address, was not good enough, because not all addresses included a street designation at all. Some addresses simply ended with the street name. I got away with it most of the time, but if the street name was 'BROAD', then the regular expression would match 'ROAD' at the end of the string as part of the word 'BROAD', which is not what I wanted. +

+

Pour continer avec mon histoire parcourir des adresses, j’ai vite découvert que limiter la détection de 'ROAD' à la fin de l’adresse n’était pas suffisant, car toutes les adresses n’incluent pas du tout de désignation de rue. Certaines adresses se terminent simplement par le nom de la rue. Je m’en suis sorti la plupart du temps, mais losque la nom de la rue était 'BROAD', l’expression rationnelle aurait détecté 'ROAD' à la fin de la chaine en temps que partie du mot 'BROAD', ce qui n’est pas ce que je voulais.

 >>> s = '100 BROAD'
 >>> re.sub('ROAD$', 'RD.', s)
@@ -68,16 +68,16 @@ 

Case Study: Street Addresses

>>> re.sub(r'\bROAD\b', 'RD.', s) '100 BROAD RD. APT 3'
    -
  1. What I really wanted was to match 'ROAD' when it was at the end of the string and it was its own word (and not a part of some larger word). To express this in a regular expression, you use \b, which means “a word boundary must occur right here.” In Python, this is complicated by the fact that the '\' character in a string must itself be escaped. This is sometimes referred to as the backslash plague, and it is one reason why regular expressions are easier in Perl than in Python. On the down side, Perl mixes regular expressions with other syntax, so if you have a bug, it may be hard to tell whether it’s a bug in syntax or a bug in your regular expression. -
  2. To work around the backslash plague, you can use what is called a raw string, by prefixing the string with the letter r. This tells Python that nothing in this string should be escaped; '\t' is a tab character, but r'\t' is really the backslash character \ followed by the letter t. I recommend always using raw strings when dealing with regular expressions; otherwise, things get too confusing too quickly (and regular expressions are confusing enough already). -
  3. *sigh* Unfortunately, I soon found more cases that contradicted my logic. In this case, the street address contained the word 'ROAD' as a whole word by itself, but it wasn’t at the end, because the address had an apartment number after the street designation. Because 'ROAD' isn’t at the very end of the string, it doesn’t match, so the entire call to re.sub() ends up replacing nothing at all, and you get the original string back, which is not what you want. -
  4. To solve this problem, I removed the $ character and added another \b. Now the regular expression reads “match 'ROAD' when it’s a whole word by itself anywhere in the string,” whether at the end, the beginning, or somewhere in the middle. +
  5. Ce que je veux vraiment, c’est détecter 'ROAD' quand il est à la fin d’une chaine et qu’il ne fait pas partie d’un autre mot. Pour exprimer cela dans une expression rationnelle, vous utilisez \b, qui signifie « une frontière de mot doit être ici ». En Python, ceci est complexe parce que le caractère '/' de la chaine lui-même doit être échappé. On appelle souvent ça le fléau du backslash, et c’est une des raisons pour laquelle les expressions rationnelles sont plus faciles en Perl qu’en Python. En même temps, Perl mélange expressions rationnelles avec la syntaxe classique, donc si vous avez un bogue, c’est plus difficile de dire s’il vient de la syntaxe ou de l’expression rationnelle. +
  6. Pour contourner le fléau du backslash, vous pouvez utiliser ce qui est appelé une chaine brute, en préfixant la chaine avec la lettre r. Ceci dit à Python que rien dans cette chaine ne doit être échappé ; '\t' est un caractère de tabulaton, mais r'\t' est vraiment le caractère backslash \ suivi de la lettre t. Je recommande toujours d’utiliser des chaines brutes lorsque vous utilisez des expressions rationnelles ; sinon les choses peuvent devenir confuses très vite (et les expressions rationnelles le sont déjà suffisament). +
  7. *pfiou* Malheureusement, j’ai vite trouve d’autres cas qui contredisaient ma logique. Dans ce cas, l’adresse contient le mot 'ROAD' seul, mais il n’est pas a la fin, car l’adresse a un numéro d’appartement juste après la désignation de la rue. Parce que 'ROAD' n’est pas exactement à la fin de la chaine, il n’est pas détecter, donc tout l’appel à re.sub() est inutile et vous récupérez la chaine de départ, ce qui n’est pas ce que vous voulez. +
  8. Pour résoudre ce problème, j’ai supprimé le caractère $ et j’ai ajouté un autre \b. Maintenant l’expression rationnelle « détecte 'ROAD' lorsqu’il est en tant que mot à part entière », que ce soit à la fin, au début, ou quelque part au milieu.

⁂ -

Case Study: Roman Numerals

-

You’ve most likely seen Roman numerals, even if you didn’t recognize them. You may have seen them in copyrights of old movies and television shows (“Copyright MCMXLVI” instead of “Copyright 1946”), or on the dedication walls of libraries or universities (“established MDCCCLXXXVIII” instead of “established 1888”). You may also have seen them in outlines and bibliographical references. It’s a system of representing numbers that really does date back to the ancient Roman empire (hence the name). -

In Roman numerals, there are seven characters that are repeated and combined in various ways to represent numbers. +

Étude De Cas : Les Nombres Romains

+

Vous avez probablement déjà vu des nombres romains, même si vous ne les avez pas reconnus. Vous avez pu les voir dans des droits d’auteurs de vieux films et séries (« Copyright MCMXLVI » au lieu de « Copyright 1946 »), ou sur les monuments muraux de bibliothèques ou d’universités (« established MDCCCLXXXVIII » au lieu de « established 1888 »), (NdT : ou tout simplement dans la numérotation de siècles). Vous pouvez aussi les avoir dans des titres ou des références bibliographiques. C’est un système représentant des nombres qui datent de l’ancien empire romain (d’où le nom). +

Dans la numérotation romaine, il y a sept caractères qui sont répétés et combinés de différentes façons pour représenter les nombres.

  • I = 1
  • V = 5 @@ -87,13 +87,13 @@

    Case Study: Roman Numerals

  • D = 500
  • M = 1000
-

The following are some general rules for constructing Roman numerals: +

Voici les différentes règles pour construire des nombres romains :

    -
  • Sometimes characters are additive. I is 1, II is 2, and III is 3. VI is 6 (literally, “5 and 1”), VII is 7, and VIII is 8. -
  • The tens characters (I, X, C, and M) can be repeated up to three times. At 4, you need to subtract from the next highest fives character. You can't represent 4 as IIII; instead, it is represented as IV (“1 less than 5”). 40 is written as XL (“10 less than 50”), 41 as XLI, 42 as XLII, 43 as XLIII, and then 44 as XLIV (“10 less than 50, then 1 less than 5”). -
  • Sometimes characters are… the opposite of additive. By putting certain characters before others, you subtract from the final value. For example, at 9, you need to subtract from the next highest tens character: 8 is VIII, but 9 is IX (“1 less than 10”), not VIIII (since the I character can not be repeated four times). 90 is XC, 900 is CM. -
  • The fives characters can not be repeated. 10 is always represented as X, never as VV. 100 is always C, never LL. -
  • Roman numerals are read left to right, so the order of characters matters very much. DC is 600; CD is a completely different number (400, “100 less than 500”). CI is 101; IC is not even a valid Roman numeral (because you can't subtract 1 directly from 100; you would need to write it as XCIX, “10 less than 100, then 1 less than 10”). +
  • Parfois les caractères sont additifs. I est 1, II est 2, et III est 3. VI est 6 (littéralement, « 5 et 1 »), VII est 7, et VIII est 8. +
  • Les caractères de dizaines (I, X, C, et M) peuvent être répétés jusqu’à trois fois. À partir de 4, vous devez soustraire du caractère en cinq suivant. Vous ne pouvez représenter 4 par IIII ; à la place, il est représenté par IV (« 1 soustrait de 5 »). 40 est écrit XL (« 10 soustrait de 50 »), 41 par XLI, 42 par XLII, 43 par XLIII, et enfin 44 par XLIV (« 10 soustrait de 50, plus 1 retiré de 5 »). +
  • Parfois les caractères sont… l’opposé d’être additifs. En ajoutant certains caractères avant d’autre, vous pouvez soustraire de la valeur finale. Par exemple, pour 9, vous devez soustraire du caractère de dizaines suivant : 8 est VIII, mais 9 est IX (« 1 retiré de 10 »), et non pas VIIII (puisque le caractère I ne peut être répété quatre fois). 90 est XC, 900 est CM. +
  • Les caractères en cinq ne peuvent être répétés. 10 est toujours représenté par X, jamais par VV. 100 est toujours C, jamais LL. +
  • Les nombres reomains sont lus de gauche à droite, donc l’ordre des caractères est très important. DC est 600 ; CD est un nombre complètement différent (400, « 100 retiré de 500 »). CI est 101 ; IC n’est même pas un nombre romain valide (car vous ne pouvez retirer directement 1 de 100 ; vous devez l’écrire XCIX, « 10 retiré de 100, plus 1 retiré de 10”).

Checking For Thousands

What would it take to validate that an arbitrary string is a valid Roman numeral? Let’s take it one digit at a time. Since Roman numerals are always written highest to lowest, let’s start with the highest: the thousands place. For numbers 1000 and higher, the thousands are represented by a series of M characters. From 21a219e2e491787c01bc6405a17c2e7f5fec3fda Mon Sep 17 00:00:00 2001 From: Astalaseven Date: Mon, 22 Jul 2013 13:02:55 +0200 Subject: [PATCH 20/24] Corrections --- 06-regular-expressions.html | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/06-regular-expressions.html b/06-regular-expressions.html index 0ed75f86..aec00a08 100644 --- a/06-regular-expressions.html +++ b/06-regular-expressions.html @@ -5,7 +5,7 @@ --- -Regular expressions - Dive Into Python 3 +Expressions régulières - Plongez dans Python 3