1.6. Prueba de módulos

Los módulos en Python son objetos y tienen varios atributos útiles. Estos pueden utilizarse para probar los módulos mientras se escriben.

Ejemplo 1.7. El truco if __name__


if __name__ == "__main__":

Unas observaciones breves antes de meternos en materia. En primer lugar, no son necesarios los paréntesis en la condición del if. En segundo lugar, la sentencia if termina con dos puntos, y le sigue código sangrado.

Nota
Al igual que C, Python usa == para comparar y = para asignar. Pero a diferencia de C, Python no admite la asignación en línea, de modo que no hay posibilidad de asignar accidentalmente el valor con el que se piensa que se está comparando.

¿Por qué esta sentencia if en concreto es un truco? Los módulos son objetos, y todos los módulos tienen un atributo __name__ incorporado. El atributo __name__ de un módulo depende de cómo se utiliza el módulo. Si se importa con import, __name__ es el nombre del fichero del módulo, sin la ruta al directorio ni la extensión. Pero también puede ejecutarse un módulo directamente como programa independiente, y en este caso __name__ adquiere un valor especial, __main__.

Ejemplo 1.8. __name__ en un módulo importado

>>> import odbchelper
>>> odbchelper.__name__
'odbchelper'

Sabiendo esto, se puede diseñar una serie de pruebas para un módulo dentro del propio módulo, incluyéndola en esta sentencia if. Cuando se ejecuta el módulo directamente, __name__ es __main__, por lo que la serie de pruebas se ejecuta. Cuando se importa el módulo, __name__ es otra cosa, por lo que la serie de pruebas se ignora. Esto hace más fácil desarrollar y depurar nuevos módulos antes de integrarlos en un programa mayor.

Sugerencia
En MacPython, hay que añadir un paso más para que funcione el truco if __name__. Mostrar el menú de opciones del módulo pulsando en el triángulo negro de la esquina superior derecha de la ventana, y asegurarse de que Run as __main__ está seleccionado.

Lecturas complementarias