2013-10-20 49 views
2

我今天在玩Python,嘗試創建自己的模塊。看起來我並不完全理解Python命名空間,我想知道是否有人能回答我關於它們的問題。有關Python命名空間和使用導入的問題

這裏是我做了什麼一個例子:我創建了一個名爲mytest的結構如下模塊

mytest/ 
....setup.py 
....bin/ 
....docs/ 
....mytest/ 
........__init__.py 
........test.py 
....tests/ 

test.py包含一個方法如下:

def say_hello(): 
    print "Hello" 

我已經通過distutils安裝了mytest。使用'點子列表'我可以看到模塊已安裝。

所有確定,但現在我想要使用它。我創建了一個測試腳本moduletest.py:

from mytest import test 

test.say_hello() 

並且運行正常,打印'Hello'消息。我對此感到滿意,並開始使用導入模塊的其他方法。

下似乎都工作確定:

from mytest.test import say_hello 

say_hello() 

和:

import mytest.test as test 

test.say_hello() 

但是,以下將不起作用:

import mytest 

test.say_hello() 

和:

import mytest 

mytest.test.say_hello() 

和:

import mytest.test 

test.say_hello() 

任何人都可以解釋爲什麼你不能導入整個mytest的模塊,然後用你想要的部分,或者你爲什麼要別名測試(進口mytest.test作爲測試),以訪問它而不是隻導入mytest.test(導入mytest.test)?

我想我的理解有點偏離,但一些解釋會真的有所幫助。 謝謝!

回答

1

從..導入表示法的工作原理是因爲您從包中導入,並不意味着模塊位於該包的「名稱空間」內,而只是表示它們位於包中。

嘗試在mytest的

from . import test 

這樣做的,然後做

import mytest 
mytest.test.say_hello() 

它會工作,因爲 「測試」 將被導入到包命名空間。

+0

這使得更多的意義!我認爲這個軟件包是模塊,並且是頂級命名空間。非常感謝! – steveYeah

3

當你這樣做:

import mytest.test 

它添加到mytest.test全局命名空間,而不是test。所以,你可以做的是:

import mytest.test 

mytest.test.say_hello() 

如果你想只使用線import mytest,你需要做的編輯__init__.py文件在你mytest目錄地說:

import mytest.test 

然後你就可以這樣做:

import mytest 

mytest.test.say_hello() 
+0

好吧,這是有道理的。很好很簡單,謝謝!如何使用導入mytest然後使用mytest.test.say_hello()? – steveYeah

+0

好點,我已經延長了答案。 –

+0

謝謝!這是否被歸類爲標準做法? (導入mytest.test) – steveYeah