Petites choses diverses à savoir pour débuter en Python

Cette page recense quelques astuces et conseils divers utiles pour les débutants Python, qui vous éviteront de perdre du temps en développant vos premiers programmes.

Quelques mots sur l'encodage des sources et UTF-8…

Voici quelque chose d'important à connaître quand on a besoin d'utiliser des accents dans nos programmes (c'est à dire à peu près toujours quand on est français…) :

print "Salut mes très bons amis"

En exécutant ce programme, vous devriez vous voir gratifié d'un intéressant mais non moins énervant :

$ python hello_world.py
  File "hello_world.py", line 1
SyntaxError: Non-ASCII character '\xc3' in file hello_world.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Pour pouvoir utiliser des caractères « spéciaux » (accents notamment) dans vos programmes (même dans les commentaires), vous devez dire à Python, de manière explicite, que vous souhaitez utiliser le codage de caractères UTF-8.

Pour cela, ajoutez simplement, systématiquement en haut de tous vos fichiers, la ligne suivante :

# -*- coding: UTF-8 -*-

Cette syntaxe permettant de spécifier l'encodage d'un fichier source Python est définie dans la PEP 0263 : « Defining Python Source Code Encodings ».

if __name__ == '__main__': kesako ?

main() n'existe pas en Python, comme on peut le trouver en C par exemple. Ce n'est pas un problème en soi et ça ne vous empêchera sûrement pas de dormir.

Il y a néanmoins un cas de figure où le fait de ne pas avoir ce genre de fonction peut être problématique : quand on inclut un module dans un autre, Python réalise un import de tout le contenu du module (logique !). Le problème, c'est que si on y place des instructions à l'extérieur de toute fonction ou méthode, elles seront exécutées systématiquement, même lors de l'inclusion du module, ce qui n'est pas terrible : on souhaite généralement importer les fonctions et classes, mais pas lancer les instructions.

C'est ici qu'intervient le test if __name__ == '__main__':

Code (mon_module.py)
# -*- coding: UTF-8 -*-
def dire_bonjour(nom):
    return 'Bonjour {qui}'.format(qui=nom)

print dire_bonjour('Pascal')
Exécution
Bonjour Pascal
Code (programme.py)
# -*- coding: UTF-8 -*-
import mon_module

print my_module.dire_bonjour('John')
Exécution
Bonjour Pascal
Bonjour John

Comme vous pouvez le voir, l'utilisation de la fonction dire_bonjour() du module mon_module.py dans le programme programme.py produit un résultat non désiré : je n'ai pas envie de dire bon jour à Pascal dans mon programme programme.py, mais à John !

Pour régler ce problème, nous allons conditionner le traitement de l'instruction print dire_bonjour('Pascal') du module mon_module.py. La condition doit être la suivante : « exécute moi ça seulement si c'est le module qui est lancé directement, et pas inclus dans un autre module ou programme ».

Code (mon_module.py)
# -*- coding: UTF-8 -*-
def dire_bonjour(nom):
    return 'Bonjour {qui}'.format(qui=nom)

if __name__ == '__main__':
    print dire_bonjour('Pascal')
Exécution
Bonjour Pascal

Lançons maintenant à nouveau notre programme programme.py :

Code (programme.py)
# -*- coding: UTF-8 -*-
import mon_module

print my_module.dire_bonjour('John')
Exécution
Bonjour John

Enfin, on ne dit plus bonjour à ce « Pascal »…

Formattage de chaînes de caractères

En Python comme dans beaucoup de langages, il est déconseillé de concaténer des chaînes de caractères avec l'opérateur +, notamment quand on y inclut des variables. On évite d'écrire ce genre de chose, car… c'est moche :

Code (déconseillé)
nom = 'John Fogerty'
groupe = 'Creedence Clearwater Revival'
date_debut = '1967'
date_fin = '1972'

print nom + ' a joué dans le groupe ' + groupe + ' de ' + date_debut + ' à ' + date_fin + '.'
Exécution
John Fogerty a joué dans le groupe Creedence Clearwater Revival de 1967 à 1972.

Pour plus de lisibilité et de maintenabilité, on utilise la fonction format(), qui est très puissante. Il s'agit en fait d'un mini système de templating, qui permet de définir des variables nommées (ou pas) dans une chaîne, puis de les remplacer par des valeurs :

Code
nom = 'John Fogerty'
groupe = 'Creedence Clearwater Revival'
date_debut = '1967'
date_fin = '1972'

print '{nom} a joué dans le groupe {groupe} de {debut} à {fin}.'.format(nom=nom, groupe=groupe, debut=date_debut, fin=date_fin)
Exécution
John Fogerty a joué dans le groupe Creedence Clearwater Revival de 1967 à 1972.

Quelques modules à connaître

Python est un langage très complet, qui inclut en standard beaucoup de modules permettant de résoudre bon nombre des problèmes auxquels le programmeur doit faire face dans la vie quotidienne.

Parmi ces modules, quelques-uns sont incontournables :

  • re : Gestion des expressions régulières (recherche, remplacement, etc.)
  • datetime : Types de données date et time, et opérations associées (comparaison, génération…)
  • os : Accès aux fonctions système (fichiers, listing de répertoires…)
  • json : Encodage et décocage json/Python

L'utilisation de ces modules est très simple :

>>> import os
>>> print os.getcwd() # Quel est le répertoire courant ?
/Users/pascal/Desktop

Beaucoup d'autres modules non livrés avec la distribution de base sont également accessibles très facilement, dans beaucoup de domaines (manipulation d'images avec PIL, gestion de grosses quantités de données, calcul scientifique…)