You are here: Sommaire > Plongez au coeur de Python > Traitement des exceptions et utilisation de fichiers > Utilisation de sys.modules | << >> | ||||
Plongez au coeur de PythonDe débutant à expert |
Les modules, comme tout le reste en Python, sont des objets. Une fois qu'il a été importé, vous pouvez toujours obtenir une référence à un module à travers le dictionnaire global sys.modules.
>>> import sys >>> print '\n'.join(sys.modules.keys()) win32api os.path os exceptions __main__ ntpath nt sys __builtin__ site signal UserDict stat
Cet exemple présente l'utilisation de sys.modules.
>>> import fileinfo >>> print '\n'.join(sys.modules.keys()) win32api os.path os fileinfo exceptions __main__ ntpath nt sys __builtin__ site signal UserDict stat >>> fileinfo <module 'fileinfo' from 'fileinfo.pyc'> >>> sys.modules["fileinfo"] <module 'fileinfo' from 'fileinfo.pyc'>
L'exemple suivant montre l'utilisation de l'attribut de classe __module__ avec le dictionnaire sys.modules pour obtenir une référence vers le module dans lequel la classe est définie.
>>> from fileinfo import MP3FileInfo >>> MP3FileInfo.__module__ 'fileinfo' >>> sys.modules[MP3FileInfo.__module__] <module 'fileinfo' from 'fileinfo.pyc'>
Chaque classe Python a un attribut de classe __module__ prédéfini, dont la valeur est le nom du module dans lequel la classe est définie. | |
En combinant cela au dictionnaire sys.modules vous pouvez obtenir une référence au module dans lequel la classe est définie. |
Maintenant vous pouvez comprendre l'utilisation de sys.modules dans fileinfo.py, le programme d'exemple présenté au Chapitre 5. Cet exemple montre cette partie du code.
def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): "get file info class from filename extension" subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
Ceci est une fonction avec deux arguments, filename est obligatoire, mais module est optionnel et est par défaut le module qui contient la classe FileInfo. Cela peut sembler peu efficace si on pense que Python évalue l’expression sys.modules à chaque fois que la fonction est appelée. En fait, Python n’évalue les expressions par défaut qu’une fois, la première fois que le module est importé. Comme nous le verrons plus loin nous n’appelons jamais cette fonction avec un argument module, module sert donc de constante au niveau de la fonction. | |
Nous détaillerons cette ligne plus tard, après avoir étudié le module os. Pour l’instant retenez simplement que subclass obtient le nom d’un classe, comme MP3FileInfo. | |
Vous connaissez déjà getattr, qui obtient une référence a un objet par son nom. hasattr est une fonction complémentaire qui vérifie si un objet possède un attribut particulier. Dans le cas présent, si un module possède une classe particulière (bien que cela fonctionne pour tout objet et tout attribut, tout comme getattr). En français, cette ligne de code dit «si le module a la classe nommée par subclass alors la retourner, sinon retourner la classe de base FileInfo». |
<< Itérations avec des boucles for |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Travailler avec des répertoires >> |