2013-05-29 52 views
2

文件a.py要比__globals__的功能不同:__globals__進口功能是在主模塊

def f(): 
    pass 

文件main.py

import a 
print("f globals") 
print(a.f.__globals__) 

def g(): 
    pass 

print("g globals") 
print(g.__globals__) 

a.f.__globals__有更多的元件比g.__globals__。在第一眼看來,內置函數和類型似乎在a.f.__globals__。爲什麼這兩本字典是不同的?

回答

4

您正在查看模塊名稱空間。 f()全局變量與g()全局變量不同,因爲它們都生活在不同的模塊中。

你會看到同樣的全局命名空間,如果你使用vars()(在main全局)和vars(a)(用於模塊a的全局):

print(sorted(vars(a).keys() - vars())) 
# prints ['__initializing__', 'f'], only `a` has `f` defined, the `__initializing__` value is a flag used by the import machinery 
print(sorted(vars().keys() - vars(a))) 
# prints ['a', 'g'], only `main` has imported `a` and defined function `g` 

每個模塊都有自己的命名空間,globals()不是全局的解釋器,它們只是模塊全局。導入模塊意味着您正在導入對該名稱空間的引用,或者創建對名稱空間的名稱的引用。

datamodel documentation上模塊對象:

模塊對象具有由字典對象實現的名字空間(這是由__globals__屬性的功能的模塊中定義的參考的詞典)

和功能對象:

__globals__:對保存函數的全局變量 - 定義函數的模塊的全局名稱空間。

主要腳本的__builtins__關鍵僅僅指向__builtins__模塊,在被導入模塊已擴大成一個字典。這些都是一樣的,真​​的。

+0

我不知道這是否真的回答了爲什麼導入函數的'__globals__'應該包含所有內建函數。 – geoffspear

+0

@Wooble:我發現在'g()'全局變量中不存在更多的'f()'全局變量鍵,除了期望值之外。 –