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