2013-04-08 15 views
18

Jestem świadomy the standard example: jeśli wykonasz moduł bezpośrednio, to jego globalna zmienna jest zdefiniowana jako "__main__". Jednak nigdzie w dokumentacji nie można znaleźć dokładnego opisu, jak zdefiniowano __name__ w ogólnym przypadku. module documentation mówi ...Jak zdefiniowana jest zmienna __name__ w module Pythona?

w module, nazwa modułu (jako ciąg) jest dostępny jako wartość zmiennej globalnej __name__.

... ale co to znaczy "nazwa modułu"? Czy jest to tylko nazwa modułu (nazwa pliku z usuniętą wersją .py), czy zawiera również w pełni kwalifikowaną nazwę pakietu?

W jaki sposób określana jest wartość zmiennej __name__ w module Python? W przypadku punktów premiowych należy dokładnie określić, gdzie w kodzie źródłowym Pythona wykonywana jest ta operacja.

+0

Widziałem różne odmiany tego pytania, ale cieszę się, że ktoś pogłębił temat. –

Odpowiedz

20

to jest do absolutnej nazwą modułu importowane. Jeśli zaimportowano go jako foo.bar, wówczas __name__ ustawiono na 'foo.bar'.

nazwa jest określona w module import.c, ale dlatego, że moduł obsługuje różne różne rodzaje importu (w tym import kodu bajtowego-Zip, tylko import modułów rozszerzających) istnieją kilka ścieżek do śledzenia kodu dzięki.

Zwykle instrukcje import są tłumaczone na połączenie z __import__, które domyślnie jest implemented as a call to PyImport_ImportModuleLevelObject. Zobacz __import__() documentation, aby dowiedzieć się, co oznaczają te argumenty. Wewnątrz PyImport_ImportModuleLevelObject względne nazwy są rozwiązane, więc możesz tam poszukać zmiennych name, jeśli chcesz.

Reszta moduł obsługuje rzeczywiste importu, z PyImport_AddModuleObject tworzenia rzeczywistego obiektu przestrzeni nazw i ustawienie klucza name, ale można prześledzić tę wartość name z powrotem do PyImport_ImportModuleLevelObject. Tworząc obiekt modułu, jego wartość wynosi __name__ w moduleobject.c object constructor.

+2

Dodatkowo,' as' subclause w 'import' nie zmienia' __name__' attibute . – andy

2

Zmienna __name__ jest atrybutem modułu, który będzie dostępny pod nazwą.

import os 
assert os.__name__ == 'os' 

Przykład siebie utworzone moduł scetches mechanizmu importu:

>>> import types 
>>> m = types.ModuleType("name of module") # create new module with name 
>>> exec "source_of_module = __name__" in m.__dict__ # execute source in module 
>>> m.source_of_module 
'name of module' 

linii z modułu rodzajów:

import sys 
ModuleType = type(sys) 
+1

Zauważ, że w Pythonie 3 'exec' jest funkcją: ' exec ("source_of_module = __name__", m .__ dict __) ' –

Powiązane problemy