# Programmation Python/Problèmes connus
## Partie 1 - Introduction

* Avant-propos à l'attention des non-programmeurs
* Introduction
* Installation
* Éditeurs
* Programmer en deux minutes
** une messagerie instantanée
** un programme interfacé avec Wikipédia
** un serveur Web

## Partie 2 - Le langage

* Afficher un texte
* Structure d'un programme
* Variables
* Opérateurs
* Structures de contrôle
* Instructions répétitives
* Types
** Numériques
** Booléens
** Chaines de caractères
** Listes
** Tuples
** Dictionnaires
** Dates
** Ensembles
* Fonctions
* Modules
* Exercices
** Palindrome
* Regex
* Programmation orientée objet pour les non-programmeurs
* Classes
* Classes et Interfaces graphiques
* Fichiers
* Exceptions
* Bases de données
** Gestion
* L'interface CGI
* Applications web
* Réseau
* Threads

## Partie 3 - Les bibliothèques

* Bibliothèques pour Python
* L'interface graphique
* Utilisation de fenêtres et de graphismes
** Tkinter
** Widgets
** Turtle
* Les threads
* XML
* JSON
* Tests
* Analyse statique de programmes
* Fabric
* Le Web
** Django
** Karrigell
** Aiohttp

## Partie 1 - Introduction

* Avant-propos à l'attention des non-programmeurs
* Introduction
* Installation
* Éditeurs
* Programmer en deux minutes
** une messagerie instantanée
** un programme interfacé avec Wikipédia
** un serveur Web

## Partie 2 - Le langage

* Afficher un texte
* Structure d'un programme
* Variables
* Opérateurs
* Structures de contrôle
* Instructions répétitives
* Types
** Numériques
** Booléens
** Chaines de caractères
** Listes
** Tuples
** Dictionnaires
** Dates
** Ensembles
* Fonctions
* Modules
* Exercices
** Palindrome
* Regex
* Programmation orientée objet pour les non-programmeurs
* Classes
* Classes et Interfaces graphiques
* Fichiers
* Exceptions
* Bases de données
** Gestion
* L'interface CGI
* Applications web
* Réseau
* Threads

## Partie 3 - Les bibliothèques

* Bibliothèques pour Python
* L'interface graphique
* Utilisation de fenêtres et de graphismes
** Tkinter
** Widgets
** Turtle
* Les threads
* XML
* JSON
* Tests
* Analyse statique de programmes
* Fabric
* Le Web
** Django
** Karrigell
** Aiohttp
[ Modifier le sommaire ]
Ce chapitre aide à résoudre les problèmes les plus courants, selon la situation ou le message d'erreur rencontré.

## Les opérations avec un caractère non-ASCII ne fonctionne pas

Ajouter l'encodage sous le shebang : # coding: utf-8.

## Le regex ajoute le symbole � à la place des pipes (|)

Encoder la chaine du pipe sous la forme d'une chaîne litérale Unicode :
* Python 2.x : ur''.
* Python 3.x+ : r''.

## re.sub ne trouve pas une expression trouvée par re.search

Dans un contexte multi-ligne, re.sub ne recherche pas tout comme re.search (qui a un global flag).
Utiliser ma_sous_chaine[re.search(regex, ma_chaine).start:re.search(regex, ma_chaine).end].

## Messages d'erreur
### ImportError: bad magic number in...

Si vous avez les fichiers sources correspondants, forcez une nouvelle compilation des fichiers sources en supprimant les fichiers compilés :
| Linux / MacOS X | rm *.pyc |
| Windows | del *.pyc |
Sinon, essayez d'obtenir les fichiers sources, ou utilisez la version de Python utilisée par ces fichiers.

### Import error: No module named monModule

Il suffit de modifier le PYTHONPATH pour qu'il trouve le module mentionné, par exemple derrière une condition s'assurant que la machine qui exécute le script contient le répertoire du module :
Dans le cas des tests unitaires, il faut en faire un package : créer __init__.py dans le dossier des tests pour qu'il importe le dossier du code à tester.

### IndexError: list index out of range

Ajouter un test sur la taille du tableau avant d'y accéder, ex :

### NameError: global name 'ma_fonction' is not defined

Si les imports sont fait avec *, les spécifier.

### sre_constants.error: bad character range

Arrive quand on inverse les paramètres dans re.compile(paramètre1).search(paramètre2).

### sre_constants.error: multiple repeat

Dans un regex, il y a des symboles de répétition consécutifs tels que **, +* ou ++.

### sre_constants.error: unmatched group

Survient quand re.sub ne trouve pas un groupe de capture. On peut donc le rechercher pour lancer le remplacement si la condition est remplie :
Sinon il y a peut-être une barre verticale non échappée à tort.

### TypeError: maMethode takes no arguments (1 given)

Une méthode de classe doit être déclarée avec l'argument "self" à minima.

### TypeError: 'module' object is not callable

Il suffit d'appeler le module sous la forme : NomFichier.NomFonction.

### TypeError: slice indices must be integers or None or have an __index__ method

Une chaine est divisée par une variable inappropriée (ex : x dans c[x:y]).

### UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position x: ordinal not in range(128)

En Python 2.7 sur Pywikibot, convertir la variable avec .encode(config.console_encoding, 'replace') (passe partout en remplaçant les caractères inconnus par des ? en console).
Sinon, ne pas utiliser str(x), par exemple au profit de :
* .encode('utf-8') pour une string
* x.__getattr__('name').encode('utf-8') pour une classe.
Dans le cas de l'affichage du résultat d'une concaténation, la séparer en deux instructions. Sinon, ajouter .encode('utf-8') après la variable résultat de la concaténation.

### UnicodeEncodeError: 'charmap' codec can't encode characters in position x-y: character maps to <undefined>

Voir l'erreur précédente.

### UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

L'encodage ou le typage faible pose problème.

### ValueError: too many values to unpack

Un "for" est mal utilisé, par exemple retirer "clé" dans : "for clé, valeur in tableau".