2010-02-05 54 views
1

我有需要的urllib2訪問類,對我來說簡單的例子是:我在哪裏可以導入一個類的urllib2?

class foo(object): 
    myStringHTML = urllib2.urlopen("http://www.google.com").read() 

我應該如何構建我的代碼包含的urllib2?在一般情況下,我想存儲與許多其他類的應用模塊foo中,並能夠通過本身從模塊導入富:

from utilpackage import foo 

是正確的樣式把進口類中?這似乎很奇怪,我,但工程....

class import_u2_in_foo(object): 
    import urllib2 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

或者我應該將富成另一種包裝,所以我總是用

import foo 
# then foo.py contains 
import urllib2 
class foo(object): 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

我應該如何在這裏構建我的代碼是最pythonic :)?

回答

4

你應該從它導入的utilpackage模塊中,但只導出類foo

import urllib2 

__all__ = ["foo"] 

class foo(object): 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

然後,你可以做

from utilpackage import foo 

但不

from utilpackage import urllib2 

這我認爲從進口的最佳做法。

+0

^加上我只會導入'urlopen',如果你不需要更多的包。 – poke 2010-02-05 14:55:40

+0

因此,__all__接受一個列表,雅?然後__all__ = [「foo」,「another_class」,「and_another_class」]如果他們存在就可以了嗎? – mcpeterson 2010-02-06 03:30:37

+0

是的,但名字是'__all__'。它定義了可以使用'from mymodule import ...'語句導入的內容。當你從'utilpackage import *'執行時,只有'__all__'列表中的內容會被導入到你的名字空間。更多細節在這裏:http://docs.python.org/tutorial/modules.html – AndiDog 2010-02-06 08:58:42

0

classimport都是正常的Python指令,沒有附加任何魔法(好吧,有些事情發生在引擎蓋下,但它們仍然只是簡單的Python指令)。

Python從上到下執行您的源代碼,執行它的每條指令 - 無論是爲指令創建新對象的指令,還是用於將新模塊導入當前作用域的指令import

此外,由於import指令一樣好指令的任何其他,你可以把它裏面class - 你可以想想類似的方法類作爲你想想.py文件中的目錄 - 而在後一種情況下,你」大概習慣了那個import可以直接放在.py文件的主要範圍。

寫了這麼多,我不知道你想加入到這個類實現的目標:

myStringHtml = urllib2.urlopen("http://www.google.com").read() 

- 該指令被解析的類的創建,然後類的所有對象正在共享相同的myStringHtml值。

就問題有關最佳的地方,把進口的urllib2,我也不太明白的問題,但對我來說似乎是最自然的做了這種方式:

import foo 

    # then foo.py contains 
    import urllib2 

    class foo(object): 
     myStringHtml = urllib2.urlopen("http://www.google.com").read() 
2

我的一般規則大拇指是,如果導入被文件中的許多東西使用,我會把它放在最上面。如果它只被一個單一的函數或一個單一的範圍使用,我會把它放在它使用的地方,比如在類或函數中。

但是,這並不是一條硬性規定,我也沒有花很多時間考慮通常導入導入的最佳位置。大多數情況下,我把它們放在頂部。

我喜歡有進口接近的地方,我使用他們兩個最大的原因是:

  • 如果函數進口它所需要的東西,然後我就可以很容易地剪切和代碼出來粘貼到另一個文件,出於測試目的,或者它是樣板代碼,比如我的「catch和syslog代碼中發生的任何異常」代碼。

  • 如果一個函數不經常使用,或者需要一個通常不常用的模塊用於不常用的部分,我不必在不使用它的時候導入它,或者要求用戶安裝一個模塊,需要。

相關問題