Un code pythonique se doit d'exploiter au mieux les modules de la bibliothèque standard. Il convient alors de les connaître dans les grandes lignes, pour être en mesure de les utiliser quand le besoin se fait sentir.
Cela commence par la bonne utilisation des fonctions built-in.
Savoir comment elles s'utilisent, connaître leurs paramètres (notamment le paramètre key
des fonctions min
, max
et sorted
).
Les types built-in sont aussi à regarder, afin d'en connaître les principales méthodes.
Je pense par exemple à la méthode format
des chaînes de caractères qui permet facilement de composer plusieurs valeurs en une chaîne.
print('{} + {} = {}'.format(2, 3, 2 + 3))
Je voudrais aussi aborder les méthodes get
et setdefault
des dictionnaires, qui permettent de gérer facilement les éléments manquants.
>>> database = {'foo': 123}
>>> database.get('bar')
>>> database.get('bar', 0)
0
>>> database.setdefault('letters', []).append('a')
>>> database.setdefault('letters', []).append('b')
>>> database
{'foo': 123, 'letters': ['a', 'b']}
Ou encore le constructeur des conteneurs standards (list
, tuple
, dict
, set
), qui accepte un autre itérable en paramètre.
>>> names = ['Alex', 'Alice', 'Bob']
>>> ages = [45, 27, 74]
>>> list(enumerate(names))
[(0, 'Alex'), (1, 'Alice'), (2, 'Bob')]
>>> dict(zip(names, ages))
{'Alex': 45, 'Alice': 27, 'Bob': 74}
Nous retrouvons enfin les exceptions built-in et leur hiérarchie.
On distinguera par exemple les TypeError
pour relever une erreur due au type d'une variable, et les ValueError
quand la valeur est du bon type mais ne correspond pas à ce qui est attendu.
On notera aussi IndexError
et KeyError
, respectivement pour un index ou une clef non trouvée dans un conteneur.
Le module collections
comporte d'autres structures de données essentielles au langage : OrderedDict
, namedtuple
, Counter
, ou encore defaultdict
qui sera préférable à une utilisation systématique de setdefault
.
Des développeurs débutants auront le réflexe de recréer ces classes, alors qu'elles sont à portée de main.
>>> from collections import Counter
>>> names = ['Alice', 'Bob', 'Bob', 'Alice', 'Alex', 'Bob']
>>> count = Counter(names)
>>> count
Counter({'Bob': 3, 'Alice': 2, 'Alex': 1})
>>> count['Alice']
2
>>> count['Camille']
0
Viennent ensuite les autres modules, tels que itertools
, functools
ou operator
.
Ces modules regroupent divers utilitaires sympathiques, qui simplifient grandement le code.
En faire bon usage permet de se conformer aux standards du langage.
>>> from itertools import product
>>> for x, y in product(range(10), range(5)):
... print('{} + {} = {}'.format(x, y, x + y))
...
0 + 0 = 0
0 + 1 = 1
...
9 + 3 = 12
9 + 4 = 13
>>> import functools, operator
>>> add_3 = functools.partial(operator.add, 3)
>>> add_3(5)
8
Enfin, suivant le domaine d'application du projet, entrent en compte les modules dédiés : re
, math
, random
, urllib
, datetime
, struct
, etc., et leurs propres bonnes pratiques, souvent détaillées dans la documentation.
La référence complète de la bibliothèque standard peut être trouvée ici.