2011-02-02 44 views
8

還有的__import__ Python文檔中的一部分,這一點我不明白:什麼是Python的__import__函數中的`globals`和`locals`參數?

__import__(name[, globals[, locals[, fromlist[, level]]]])

功能導入模塊name,可能使用給定globalslocals,以確定如何解釋name在包裝上下文中。標準實現完全不使用locals參數,並且僅使用它的globals來確定導入語句的包上下文。

什麼是「解釋」模塊名稱?什麼是包裝上下文?

使用這些參數的示例調用看起來是這樣的:

spam = __import__('spam', globals(), locals(), [], -1) 

爲什麼例子提供globals()locals()的功能?當我只提供globals()會發生什麼?或者既不?

我可能錯過了某些與導入模塊有關的名稱空間邏輯部分。你能不能指出一篇文章解釋這個/有__import__函數的例子?

+1

不應該將此問題移至StackOverflow嗎? – EOL 2011-02-02 09:52:12

+0

這很有趣,我開始在SO上寫這個,但是在想我是否應該把它發佈在程序員上。相反......我顯然需要看FAQ ...... – 2011-02-02 09:56:18

+0

你應該選擇以下答案之一作爲接受這個問題的答案。恕我直言,9000的答案通過解釋Python使用`globals`來確定模塊名稱空間來解決問題。 – Kumba 2012-10-16 04:14:56

回答

4

標準實現不使用它的locals參數所有,並使用其globals只確定import語句的包環境。

(從docs.python.org

我仍然不知道如何globals被使用;什麼樣的全球變量可以影響import聲明的工作方式?

編輯:在Python 2.5源代碼看着import.c後,我發現,__import__希望能夠找到或者在globals__name____path__以進口搜索路徑相對於這些變量中的一個找到的路徑(S)增加,以該順序。

0

什麼是「解釋」模塊名稱?什麼是包裝上下文?

當你進入

>>> a 

的Python必須 「解釋」 這個名字。這是全球性的嗎?這是一個本地?

>>> def f(x): 
... return x * a 

現在,x顯然是本地的。 a必須被「解釋」。全球?本地?

爲什麼該示例向函數提供globals()和locals()?當我只提供globals()時會發生什麼?或者既不?

試試看看。認真。玩它比玩它更容易。

重要的是,你在>>>提示中所做的事情是全局性的。

您需要定義將創建本地上下文的函數,以便您可以看到全局和本地之間的差異。

1

globals用於確定導入被調用的當前上下文。例如:

""" 
/myproject/a/b.py 
/myproject/a/foo.py 
/myproject/c/d.py 
/myproject/c/foo.py 
""" 

# Which foo gets imported? 

import foo #1 
foo = __import__('foo') #2 

它們是不一樣的,因爲#2沒有(簡單的)方法來知道從哪個模塊調用了導入。 __import__函數需要知道哪個是當前模塊實際導入foo

__import__()的內部,globals用於獲取調用導入的當前模塊的引用。從__import__source code:是在正在執行的進口

返回包如果全局來 從模塊foo.bar.bat(本身不是一個包),這個返回的 sys.modules中的條目foo.bar。如果全局變量來自程序包的init .py, ,那麼sys.modules中的程序包條目將作爲借用的引用返回。

相關問題