2008-10-09 170 views
7

我已經看到一些Python程序員使用下面的風格非常一致(我們稱之爲樣式1):'from X import a'versus'import X; X.a」

import some_module 
# Use some_module.some_identifier in various places. 

爲了支持這種風格,可以舉"explicit is better than implicit"格言。我見過的其他程序員使用這種樣式(樣式2):

from some_module import some_identifier 
# Use some_identifier in various places. 

,我的風格2中看到的主要好處是可維護性 - 尤其是duck typing理想我可能要交換some_module爲some_other_module。我同樣以"readability counts"的格言來感受風格2的勝利。儘管我傾向於不同意,但人們總是可以爭辯說,在使用第一種風格時,搜索和替換也是一個很好的選擇。

附錄:有人指出,你可以在風格1.使用as從解決some_module交換機some_other_module我忘了提及的是,還共同決定你當前模塊,在實現some_identifier哪些使創造一個等效的容器稍微尷尬。

回答

4

有兩種情況下使用,所以我不認爲這是一個非此即彼的問題。 我會考慮從模塊import x,y,z使用時:

  • 有一個相當小的一些事情導入

  • 進口功能的目的,從模塊名稱離婚時,是顯而易見的。如果名字相當通用,他們可能會與其他人發生衝突,並告訴你一點。例如。看到remove告訴你一點,但os.remove可能會暗示你正在處理文件。

  • 名稱不衝突。與上面類似,但更重要。 決不做這樣的事情:

    from os import open 
    

import module [as renamed_module]的優點是,它提供了有關當您使用它現在被稱爲多一點背景。它的缺點是,當模塊沒有真正提供更多信息時,這會變得更加混亂,並且性能略低(2次查找而不是1次)。

它在測試時也有優勢(例如替換os。用模擬對象打開,而不必更改每個模塊),並且應該在使用可變模塊時使用,例如,

import config 
config.dburl = 'sqlite:///test.db' 

如果有疑問,我總是會用import module的風格。

5

以下語法的存在:

import some_other_module as some_module 

的風格2可維護性參數已不再相關。

我傾向於使用樣式1.通常,我發現我在典型的Python程序中只顯示幾次導入的包名。其他的東西都是對象上的方法,當然不需要引用導入的包。

2

我通常使用閾值來決定這一點。如果我想使用的東西很多內some_module,我將使用:

import some_module as sm 
x = sm.whatever 

如果只有一兩件事情,我需要:

from some_module import whatever 
x = whatever 

這是假設我不需要一個whatever當然是some_other_module

我傾向於在導入中使用as子句,以便我可以在未來輕鬆地將另一個模塊替換爲另一個模塊。

0

我相信在Python的新版本,你甚至可以做(2.5+必須檢查我的事實......?):

import some_other_module as some_module 

所以,你仍然可以用風格1和交換去不同的模塊後上。

我認爲它通常映射到你想要混亂你的名字空間。你會在模塊中使用一個還是兩個名字?或者他們全部(from x import *不是總是不好,一般)?

1

我發現符號

from some_module import some_symbol 

最適合在大多數情況下。此外,在名字交鋒符號的情況下,你可以使用:

from some_module import some_symbol as other_symbol 

由於該問題時,它避免了重寫模塊名稱所有的時間,與錯誤輸入它的風險各一次。我使用的語法:

import module [as other_module] 

只有在兩種情況下:

  1. 我用太多的模塊功能/對象以導入所有
  2. 模塊定義了一些符號,它可能會在執行過程中改變
2

我喜歡import X然後用X.a儘可能。

我的異常集中在像Django這樣的大型框架中的深層嵌套模塊。他們的模塊名稱往往會變得冗長,他們的例子都說from django.conf import settings爲您節省您在任何地方輸入django.conf.settings.DEBUG

如果模塊名稱深度嵌套,則例外情況是使用from X.Y.Z import a

0

我個人儘量不要惹太多與我的命名空間,所以在大多數情況下,我只是做

import module 

或 導入模塊爲國防部

只有真正diffrence是當我有一個模塊一個使用了很多的單一類。如果我有一個sublclassed型list添加一些的funcionality那裏,我會使用

from SuperImprovedListOverloadedWithFeatures import NewLIst 
nl = NewList() 

0

我傾向於只使用每個模塊的幾個成員,所以在我的代碼有很多

from john import cleese 
from terry import jones, gilliam 

。如果我期望使用大部分模塊並且模塊名稱很短,我將導入整個模塊(例如oswx)。如果存在名稱衝突,我還會導入整個模塊,或者我想提醒讀者該函數與哪個關聯。

import michael 
import sarah 

import wave 

gov_speech = wave.open(sarah.palin.speechfile) 
parrot_sketch = wave.open(michael.palin.justresting) 

(我可以用from wave import open as wave_open,但我想這wave.open將是讀者比較熟悉。

相關問題