Я просто хочу сначала устранить некоторую путаницу. __file__
это не подстановочный знак, это атрибут. Атрибуты и методы двойного подчеркивания считаются «специальными» по соглашению и служат специальной цели.
http://docs.python.org/reference/datamodel.html показывает многие специальные методы и атрибуты, если не все.
В данном случае __file__
это атрибут модуля (объект модуля). В Python .py
файл является модулем. Так import amodule
будет иметь атрибут, __file__
который означает разные вещи в разных обстоятельствах.
Взято из документов:
__file__
путь к файлу, из которого был загружен модуль, если он был загружен из файла. __file__
Атрибут отсутствует для модулей C, которые статически связаны в интерпретатор; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу общей библиотеки.
В вашем случае модуль обращается к своему __file__
атрибуту в глобальном пространстве имен.
Чтобы увидеть это в действии, попробуйте:
# file: test.py
print globals()
print __file__
И запустить:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__
НЕ определяется во всех случаях, например, статически связанные модули C. Мы не можем рассчитывать на__file__
постоянную доступность.