Ich möchte nur zuerst auf einige Verwirrung eingehen. __file__ist kein Platzhalter, sondern ein Attribut. Doppelte Unterstrichattribute und -methoden gelten gemäß Konvention als "speziell" und dienen einem besonderen Zweck.
http://docs.python.org/reference/datamodel.html zeigt viele der speziellen Methoden und Attribute, wenn nicht alle.
In diesem Fall __file__handelt es sich um ein Attribut eines Moduls (ein Modulobjekt). In Python ist eine .pyDatei ein Modul. Also import amodulewird ein Attribut haben, __file__das unter verschiedenen Umständen verschiedene Dinge bedeutet.
Entnommen aus den Dokumenten:
__file__ist der Pfadname der Datei, aus der das Modul geladen wurde, wenn es aus einer Datei geladen wurde. Das __file__Attribut ist für C-Module, die statisch mit dem Interpreter verknüpft sind, nicht vorhanden. Bei Erweiterungsmodulen, die dynamisch aus einer gemeinsam genutzten Bibliothek geladen werden, ist dies der Pfadname der gemeinsam genutzten Bibliotheksdatei.
In Ihrem Fall greift das Modul auf sein eigenes __file__Attribut im globalen Namespace zu.
Um dies in Aktion zu sehen, versuchen Sie:
# file: test.py
print globals()
print __file__
Und Renn:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__ist NICHT in allen Fällen definiert, z. B. statisch verknüpfte C-Module. Wir können uns nicht darauf verlassen,__file__immer verfügbar zu sein.