2012-10-28 60 views
3

正如標題所說,我需要重新導入一個模塊,該模塊導入到我的主文件中嗎?在這找不到任何東西,也不確定要搜索什麼。因爲這不工作,直到我在epicness進口otherepic我是否需要重新導入其他模塊中的模塊

文件1:

import epicness 
import otherepic 

epicness.someother(3) 

epicness:

def someother(x): 
    return dosomething(x) 

otherepic:

def dosomething(x): 
    return x*4 
+2

是的,** **但是如果你設計你的項目正常,你不應該需要。做到這一點,以便類/文件不依賴於彼此縱橫交錯,而是以有組織的樹狀方式。你可以把'dosomething'放在'史詩'中。在這個例子中,你可以從'file1'中刪除'import otherepic'。 – Junuxx

+3

每個模塊都有其名稱空間。除非你導入外部符號,否則它不會知道它們。請參見[Python名稱空間解釋](http://stackoverflow.com/questions/4950402/explanation-of-python-namespaces)。 –

+0

這是一個簡短的例子,但是,我想要在單獨的文件中使用命令,而不是將命令與程序中的代碼混合使用。我使用靜態屬性作爲全局數據庫的程序中的類。我有一個應該修改職位並需要訪問該職位的命令。 – Andreas

回答

4

是的,你必須輸入一切你需要在每個模塊中。如果在module_a中使用module_b中定義的函數B,則必須在module_a之內導入module_b,或至少從module_b導入B函數。

說明:

在Python模塊中是對象!當您導入執行的代碼模塊,並且被定義一切有連接到模塊對象的__dict__

$ echo 'a=1' > testing.py 
$ python 
Python 2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import testing 
>>> 'a' in testing.__dict__ 
True 

該模塊的__dict__還包含了常用的全球內置插件。 在模塊中定義的任何東西都使用該模塊的__dict__作爲全局範圍。 在python中沒有像「全局變量」這樣的意思,意思是從每個模塊/類/函數都可以訪問的變量。全局變量實際上只是一個模塊的即時變量。

如果你想導入一個模塊的一些項目到其它模塊的名字空間,你可以使用from語法:

from module_a import functionA, functionB, classA, CONSTANT 

您可以使用*進口的一切:

from module_a import * 

但要避免使用from ... import *語法!你會得到像C包含的命名空間衝突。只有在模塊在其文檔中聲明它是*-進口安全時才這樣做。 製作模塊* -import safe您可以定義全局的__all__,它應該是一串字符串,表示執行* -import時應該導出的標識符。

例如:

#module_a 
A = 1 
B = 2 
__all__ = ['A'] 

#module_b 
from module_a import * 
print(A) #okay 
print(B) #NameError, B was not exported! 
+1

還應該指出,導入已導入的模塊是一個相對較快的操作,因爲它們會自動緩存在['sys.modules'](http://docs.python.org/ 2/library/sys.html?highlight = sys.modules#sys.modules)字典。 '。 – martineau