2011-06-16 127 views
11

任何人都可以建議我什麼是導入python模塊最pythonic的方式? 讓我解釋一下 - 我已經閱讀了大量的Python代碼,發現如何導入模塊幾種不同的方式,或者更精確地說 - 當導入:Python中導入模塊的最pythonic方式是什麼

  1. 使用一個模塊/多個模塊,其中包括所有的進口(第三方模塊),這是整個項目所必需的,因此所有的進口都集中在幾個模塊中,因此很容易維護進口。當任何單個模塊需要導入任何模塊時,它都會詢問參考模塊。 例如在我們的項目中,我們已經分離了名爲'references'的級別,因此它包含像'system.py'(包含對所有系統庫的引用),'platform.py'(包含對所有平臺庫的引用)'devexpress'等模塊。 py'(包含對所有devexpress庫的引用)等等。這些模塊如下所示:
  2. 每個模塊在模塊的頂部導入所有必需的類和功能 - 例如,在項目中的每個模塊中都有一個導入部分
  3. 每個函數/類在本地使用導入,例如在定義之後立即導入,只導入他們真正需要的東西。

請在下面找到樣品。

1樣品導入模塊 - 僅 '進口' 和 '從......進口...' 語句(沒有任何方法或類):

#references.py 
import re 
import clr 
import math 

import System 
import System.Text.RegularExpressions 
import System.Random 
import System.Threading 
import System.DateTime 

# System assemblies 

clr.AddReference("System.Core") 
clr.AddReference("System.Data") 
clr.AddReference("System.Drawing") 
... 

#test.py 
from references.syslibs import (Array, DataTable, OleDbConnection, OleDbDataAdapter, 
           OleDbCommand, OleDbSchemaGuid) 

def get_dict_from_data_table(dataTable): 
    pass 

2模塊與來自 '進口' 和」。 ..進口...」以及方法和類:

from ... import ... 
from ... import ... 

def Generate(param, param1 ...): 
    pass 

3模塊與‘從...導入進口’和‘...’其的方法和類內使用的語句:

import clr 
clr.AddReference("assembly")  

from ... import ... 
... 

def generate_(txt, param1, param2): 
    from ... import ... 
    from ... import ... 
    from ... import ... 

    if not cond(param1): res = "text" 
    if not cond(param2): name = "default" 

那麼什麼是在python中導入模塊最pythonic的方式?

回答

13

真的沒關係,只要你不要from ... import *。其餘的都是味道,解決循環進口問題。 PEP 8指出您應該在腳本的頂部導入,但即使這樣也不會成立。

+0

謝謝你的回覆。但從代碼可讀性的角度來看,使用1,2,3有什麼好處。哪一個對大多數人來說更具可讀性? – 2011-06-16 13:23:49

+1

頂部是最具可讀性的,因爲查看代碼的人只需引用一個地方即可查看名稱來自哪個包/模塊。 – 2011-06-16 13:46:58

+0

酷 - 這意味着我選擇了正確的方向 – 2011-06-16 13:52:58

3

Python的「進口」裝入一個Python模塊到自己的命名空間,所以,你必須從導入模塊

import animals 
animals.Elephant() 

「從添加模塊名稱,然後在引用前面任何名稱的點「加載一個Python模塊到當前的命名空間,讓你可以參考它,而不需要再次提及的模塊名稱

from animals import Elephant 
Elephant() 

from animals import * 
Elephant() 

使用從很好,(但使用通配符導入是令人沮喪)。但是如果你有一個大型項目,從不同模塊導入可能會導致命名混亂。就像來自兩個不同勢模塊導入大象()功能會造成問題(就像使用通配符進口與*

所以,如果你有,你從其它模塊引入許多不同勢東西大縮放的項目,它是更好地使用導入和使用導入的東西module_name.your_class_or_function。否則,使用符號...

+0

我同意asterix('*')是邪惡的。所以前一段時間我仔細檢查了我們的所有庫,並刪除了所有導入*語句。然而,我的問題是關於進口報表的正確位置,而不是關於什麼是最好使用進口或從...進口... Thanx爲您的答覆。 – 2011-06-16 13:21:05

+0

星號不是邪惡的,它只是需要謹慎使用。有一些庫被設計爲被導入到當前名稱空間中,例如Tkinter。 – Todd 2011-06-16 14:57:30

5

人們已經對主要風格問題(腳本的頂部等)進行了評論,所以我會跳過這一點。

對於我的導入,我通常會按照模塊名稱的字母順序排列它們(不管它是'導入'還是'from ... import ...'),我將它分成以下組:標準庫;第三方模塊(一封來自PyPI或其他);內部模塊

import os 
import system 

import twisted 
import zope 

import mymodule_1 
import mymodule_2 
+1

我也是。我曾參與公司級別的PEP8風格指南,我們也決定在所有項目中使用相同的進口訂單。這個槓桿是1)python庫(像random,itertools等)2)從引用模塊導入3)從核心模塊導入4)導入項目特定模塊和5)導入模塊特定模塊 – 2011-06-16 14:09:28

3

不要使用from module import *這會污染命名空間,在高度皺起眉頭但是,您可以使用導入具體的事情; from module import something這樣可以使命名空間乾淨在較大的項目中,如果使用通配符,則可以將2 foo或2 bar導入到相同的名稱空間中。PEP 8表示在單獨的行上輸入。例如:

import os 
import sys 
import yourmodule 
from yourmodule import specific_stuff 

我要做的一件事是將我的進口按字母順序分成兩組。一個是std /第三方,第二個是內部模塊。

相關問題