Le module types
fournit diverses fonctions permettant de manipuler plus facilement les différents types disponibles.
Le module fournit d'abord deux variables (ce serait cool si ça pouvait être des constantes, mais bon, Python ^^), iter
qui correspond au type des générateurs, et classicols
, qui contient les types de collections les plus courants (tuple, list, set, frozenset, ainsi que deque et Counter du module collections
).
Il fournit ensuite une fonction iterable, destinée à vérifier si un objet passé en paramètre est itérable ou non. Pour cela, cette fonction teste la présente d'une méthode __iter__
, ou la présence simultanée des méthodes __getitem__
et __len__
(il est techniquement possible de créer un générateur si seule la méthode __getitem__
est présente, mais celui-ci a peu de chances de fonctionner dans ce cas). Un paramètre booléen supplémentaire permet de dire si le type str
doit être considéré comme itérable ou pas, un certain nombre d'usage s'appliquant à « tous les types itérables sauf les strings ».
Sur le même modèle, une fonction mapping vérifie si un type peut être considéré comme un mapping ou non, ce qui se fait en vérifiant la présence des méthodes __getitem__
et keys
(ce qui semble être la condition minimale satisfaisante pour autoriser un appel de la forme « fonction(**objet) »).
La fonction throw renvoie la valeur qu'on lui passe en paramètre sans aucun changement, sauf s'il s'agit d'une exception, auquel cas elle est déclenchée (on peut ajouter au besoin différentes classes d'exceptions qui ne doivent pas être déclenchées). Cette fonction est notamment utilisée pour gérer la valeur par défaut dans les tentatives de conversion (voir ci-dessous).
La classe data est une classe prenant un nombre arbitraire de clefs/valeurs lors de son initialisation, et les affectant comme attributs à l'objet résultant. Elle peut ainsi être utilisée pour émuler rapidement un déclenchement d'événement lorsque quelques attributs seulement vont être utilisés par la méthode appelée.
La classe frozendict vise à être un équivalent non-modifiable de la classe dict
, comme un tuple
l'est pour une list
ou un frozenset
pour un set
, étant donné qu'il est assez domage qu'un tel type d'objets n'existe pas nativement en Python.
Enfin, l'objet parse est un objet particulier permettant de réaliser un certain nombre de conversions, qui vise notamment à obtenir des valeurs utilisables en Python à partir de chaînes de caractères échangées entre deux programmes ou lues depuis la configuration.
On peut utiliser cet objet comme un dictionnaire, en utilisant comme clefs soit les types désirés (int
, str
, etc.), soit la chaîne de caractère correspondante, chacune renvoyant la fonction de conversion concernée. Il est également possible d'appeler directement l'objet parse
en passant d'abord la valeur à convertir, puis le type attendu, puis les autres paramètres de conversion, ce qui facilite certains usages automatiques. Les types de base gérés directement par le module sont les suivants :
bool
, la fonction prenant en paramètre une valeur par défaut (ou exception à déclencher) en cas d'échec, ainsi que d'éventuels paramètres supplémentaires pour indiquer des retours associées à des chaînes spécifiques. Par défaut, toute chaîne parmi « true, t, on, ok, yes, y, ✔ » est considérée comme valant vrai, et toute chaîne parmi « false, f, off, ko, no, n, ✗ » comme valant faux (case-insensitive). La conversion en entier est également testée, tout nombre positif étant considéré comme vrai, et tout nombre négatif comme faux (0 renvoie la valeur par défaut). Si la valeur passée est un itérable autre qu'une chaîne de caractère, toutes les valeurs contenues doivent être identiques pour renvoyer vrai ou faux.int
, la fonction prenant en paramètre une valeur par défaut (ou exception, idem), des valeurs minimale et maximale (l'infini par défaut), et un booléen indiquant s'il faut forcer l'ajustement ou non. La fonction de conversion accepte les chiffres arabes, les chiffres romains (si le module roman
est disponible, après normalisation unicode si besoin), et gère les bases 2, 8 et 16 en cas d'usage d'un préfixe 0b, 0o, 0x ou #. La conversion en nombre flottant est également tentée au besoin. Le dernier paramètre est utilisé si la valeur obtenue dépasse l'intervalle indiqué ou qu'il s'agit d'un nombre non-entier : s'il est à vrai, la valeur est ramenée au minimum/maximum ou arrondie, s'il est à faux (ce qui est le cas par défaut), la valeur par défaut est renvoyée.float
, la fonction prenant en paramètre une valeur par défaut (toujours pareil) et possiblement un nombre arbitraire de « variables ». En effet, cette fonction peut évaluer, pour peu qu'on lui donne les valeurs requises, des expressions mathématiques comme « πr² » ou « √5 » (les valeurs de π, τ et φ sont considérées comme connues). Ce parsage convertit la valeur fournie en une chaîne interprétable par Python, puis appelle eval
(mais après s'être assurée que la chaîne ne contenait que des valeurs numériques et des signes d'opérations, donc ça devrait quand même limiter les risques d'ennuis).str
, qui ne fait pas forcément grand chose de terrible, mais on peut quand même lui passer une liste de valeurs acceptées, pour limiter le nombre de résultats possibles en cas de besoin.iter
, tuple
, list
, set
, frozenset
, deque
ou Counter
(c'est en fait le convertisseur pour iter
qui est utilisé à chaque fois, puis le résultat est automatiquement passé dans le type demandé), qui essaye de découper la valeur fournie de son mieux d'après les délimiteurs classiques. Le résultat est vide si la valeur d'entrée est None
ou une chaîne vide. Si aucune découpe n'a pu être faite, une seule valeur est renvoyée. Ces différentes méthodes n'ont pas de valeur par défaut, mais peuvent prendre en paramètre un autre type et ses paramètres, pour tenter de convertir chaque élément.Un décorateur register
permet de référencer des types fonctions de parsage vers d'autres types en cas de besoin. Typiquement, les thing
et stuff
de la bibliothèque correspondante, ou les couleurs de la bibliothèques d'images, peuvent également être obtenues par parse
lorsque ces bibliothèques sont chargées.