Solo quiero abordar algo de confusión primero. __file__
no es un comodín, es un atributo. Los atributos y métodos de subrayado doble se consideran "especiales" por convención y tienen un propósito especial.
http://docs.python.org/reference/datamodel.html muestra muchos de los métodos y atributos especiales, si no todos.
En este caso __file__
es un atributo de un módulo (un objeto de módulo). En Python un .py
archivo es un módulo. Entonces import amodule
tendrá un atributo de lo __file__
que significa cosas diferentes en circunstancias diferentes.
Tomado de los documentos:
__file__
es la ruta del archivo desde el que se cargó el módulo, si se cargó desde un archivo. El __file__
atributo no está presente para los módulos C que están vinculados estáticamente en el intérprete; para módulos de extensión cargados dinámicamente desde una biblioteca compartida, es la ruta del archivo de la biblioteca compartida.
En su caso, el módulo está accediendo a su propio __file__
atributo en el espacio de nombres global.
Para ver esto en acción, intente:
# file: test.py
print globals()
print __file__
Y correr:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__
NO está definido en todos los casos, por ejemplo, módulos C estáticamente vinculados. No podemos contar con__file__
estar siempre disponibles.