| You are here: Inicio > Inmersión en Python > Excepciones y gestión de ficheros > Uso de sys.modules | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Los módulos son objetos, como todo lo demás en Python. Una vez importado, siempre puede obtener una referencia a un módulo mediante el diccionario 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
Este ejemplo demuestra el uso 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'>
El siguiente ejemplo muestra el uso del atributo de clase __module__ con el diccionario sys.modules para obtener una referencia al módulo en el que está definida una clase.
>>> from fileinfo import MP3FileInfo >>> MP3FileInfo.__module__'fileinfo' >>> sys.modules[MP3FileInfo.__module__]
<module 'fileinfo' from 'fileinfo.pyc'>
| Cada clase de Python tiene un atributo de clase __module__ incorporado, que consiste en el nombre del módulo en que se definió la clase. | |
| Combinando esto con el diccionario sys.modules, podemos obtener una referencia al módulo en que se definió la clase. |
Ahora ya está listo para comprobar el uso de sys.modules en fileinfo.py, el programa de ejemplo presentado en Capítulo 5. Este ejemplo muestra esa porción de código.
def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
"obtener la clase de información de un fichero por su extensión"
subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
return hasattr(module, subclass) and getattr(module, subclass) or FileInfo 
| Ésta es una función con dos argumentos; filename es obligatoria, pero module es opcional y por omisión es el módulo que contiene la clase FileInfo. Esto no parece eficiente, porque es de esperar que Python evalúe la expresión sys.modules cada vez que se llama a la función. En realidad, Python evalúa las expresiones por omisión sólo una vez, la primera en que se importa el módulo. Como verá más adelante, nunca se llama a esta función con un argumento module, así que module sirve como constante en la función. | |
| Volveremos a esta línea más adelante, tras sumergirnos en el módulo os. Por ahora, creáse que subclass acaba siendo el nombre de una clase, como MP3FileInfo. | |
| Ya conoce getattr, que obtiene una referencia a un objeto por su nombre. hasattr es una función complementaria, que comprueba si un objeto tiene un atributo en particular; en este caso, si un módulo tiene una clase en particular (aunque funciona con cualquier objeto y cualquier atributo, igual que getattr). En idioma humano el código de esta línea dice, “Si este módulo contiene la clase denominada subclass entonces devuélvela, en caso contrario devuelve la clase base FileInfo.” |
<< Iteración con bucles for |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Trabajo con directorios >> |