Je veux d'abord dissiper une certaine confusion. __file__
n'est pas un joker, mais un attribut. Les attributs et méthodes à double trait de soulignement sont considérés comme "spéciaux" par convention et servent un objectif particulier.
http://docs.python.org/reference/datamodel.html présente un grand nombre de méthodes et d'attributs spéciaux, mais pas tous.
Dans ce cas __file__
est un attribut d'un module (un objet module). En Python, un .py
est un module. Donc import amodule
aura un attribut de __file__
ce qui signifie des choses différentes dans des circonstances différentes.
Tiré de la documentation :
__file__
est le nom du chemin du fichier à partir duquel le module a été chargé, s'il a été chargé à partir d'un fichier. L'adresse __file__
n'est pas présent pour les modules C qui sont liés statiquement à l'interpréteur ; pour modules d'extension chargés dynamiquement à partir d'une bibliothèque partagée, il s'agit du nom de chemin de la bibliothèque partagée. nom de chemin du fichier de la bibliothèque partagée.
Dans votre cas, le module accède à son propre fichier __file__
dans l'espace de nom global.
Pour voir cela en action, essayez :
# file: test.py
print globals()
print __file__
Et courez :
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py