Eu só quero resolver alguma confusão primeiro. __file__
não é um curinga, é um atributo. Os atributos e métodos de sublinhado duplo são considerados "especiais" por convenção e servem a um propósito especial.
http://docs.python.org/reference/datamodel.html mostra muitos dos métodos e atributos especiais, se não todos.
Nesse caso, __file__
é um atributo de um módulo (um objeto de módulo). No Python, um .py
arquivo é um módulo. Então import amodule
, terá um atributo __file__
que significa coisas diferentes em circunstâncias diferentes.
Retirado dos documentos:
__file__
é o nome do caminho do arquivo do qual o módulo foi carregado, se foi carregado de um arquivo. O __file__
atributo não está presente para os módulos C que estão estaticamente vinculados ao intérprete; para módulos de extensão carregados dinamicamente de uma biblioteca compartilhada, é o nome do caminho do arquivo da biblioteca compartilhada.
No seu caso, o módulo está acessando seu próprio __file__
atributo no espaço para nome global.
Para ver isso em ação, tente:
# file: test.py
print globals()
print __file__
E corra:
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ÃO é definido em todos os casos, por exemplo, módulos C vinculados estaticamente. Não podemos contar com a__file__
disponibilidade sempre.