2014-06-17 67 views
6

當我編程Python和我需要導入多個模塊,我通常做我喜歡這樣的:在一條線上有多個進口有什麼不好嗎?

import random, time, matplotlib, cheese, doge 

後來,當我讀了別人的代碼,這是我所看到的:

import random 
import time 
import matplotlib 
import cheese 
import doge 

這是爲什麼?這兩種風格有什麼區別?

+0

我回答了每行一個導入的很多好處 - 其中大多數解決了維護每行多個導入代碼的問題,特別是在大型Python代碼庫中。 – pcurry

回答

9

按照PEP-8(樣式指南Python代碼)

Imports should usually be on separate lines, for e.g 

Yes: import os 
    import sys 

No: import sys, os 

It's okay to say this though: 

from subprocess import Popen, PIPE 

要回答你的問題 - 既會工作得很好,但一個是不符合性與PEP8準則。

+0

我通常更喜歡將我的所有進口保留在一行中,除非行字符數超過80,以保持我的代碼更短。以防因某種原因我有50件進口產品。 –

+0

正確 - 我看到不少程序員這樣做。準則是爲開發人員提供全面一致性的一種方法。他們更多的是慣例 - 可以這麼說「錯誤」。根據我的經驗/意見,按照指導方針是一個好主意。 – karthikr

+0

短代碼更好,因爲...? – holdenweb

1

這兩個例子在功能上是等同的。然而,PEP 8,官方的風格指南Python的,有譴責放置多個進口在一行的實踐部分here

 
Imports should usually be on separate lines, e.g.: 

    Yes: import os 
     import sys 

    No: import sys, os 

It's okay to say this though: 

    from subprocess import Popen, PIPE 

因此,許多Python程序員將每行只有一個導入以遵循這個準則。

1

PEP-8是官方的Python風格指南,規定每行應該導入一個包或模塊。

它被認爲是很好的風格,通常標準化使程序易於閱讀。如果這就是你所要求的,我不認爲在引擎蓋下存在實質差異。

8

每行一個進口的做法是在PEP8中標準化的,遵循一個通用的標準就足以像其他人那樣做。遵循一個通用標準遵循Principle of Least Astonishment,使熟悉標準的人們更容易閱讀和修改代碼。

儘管您不關心PEP8,但每行一次導入會使您的代碼更易於維護。

  • 進口更容易脫脂/讀取

    • 它更容易看到你在import fred得到一個fredimport barney, betty, wilma, fred, bambam, pebbles
  • 進口更容易找到

    • 搜索「進口弗雷德」會發現import fredimport fred, wilma, pebbles,但不會找到import barney, fred
  • 進口更容易編輯

    • 插入和取出整條生產線是快在大多數編輯中。
    • 每行只有一個模塊,因此您不必在行中搜索以找到您想要編輯的內容 - 最後。
    • 在模塊中重新定位導入只是移動整條線。
    • 將其中一個導入複製到另一個Python模塊是一行 的複製粘貼,而不是複製粘貼,然後修剪掉您不需要的其他導入。
  • 進口更易於維護

    • 每個改變模塊的變化,設定自己的路線 - 你不必看一條線,找出哪些模塊或模塊改變。
    • 缺失和添加的模塊會影響文件和更改集中的行數。
    • 錯別字更易於挑選和更正變更集的視覺效果。每行

一個進口將是即使它是不是標準的一個好主意。既然這是標準,那麼最好的辦法就是加倍。

+0

我喜歡直覺,而不僅僅是參考PEP8! –

1

我不喜歡盲目追隨沒有正當理由。作爲PEP20:Python中的禪指出「可讀性計數」

PEP8「每單進口行」的作品一般觀點。儘管我尊重他(即Guido)的觀點,但我並不總是嚴格遵守這些慣例。

此規則的例外情況是隻有當#號碼小於模塊導入的號碼時。例如2行代碼,但4個模塊導入。

這是更具可讀性:(在我看來)

import os, sys, math, time 

def add_special(): 
    return time.time() + math.floor(math.pow(sys.api_version + os.getpid(), 2)) 

,而不是這個

import os 
import sys 
import math 
import time 

def add_special(): 
    return time.time() + math.floor(math.pow(sys.api_version + os.getpid(), 2)) 

但這可讀性事因每個人。

相關問題