2014-01-12 28 views
2

我正在用python寫一個程序。我使用了大約十幾個模塊。目前我已經將它們放置在功能本身中。我的推理是,由於用戶不會使用會話中的所有功能,因此許多模塊不必無用地導入,直到功能需要它們。但直到現在我看到的所有代碼在開始時都有它們的輸入。他們的理由和優勢是什麼?(Python)爲什麼不在函數中導入模塊,而是在開始導入它們的最佳方式?

另外什麼是最好的導入方式?我見過幾個類型,如:

  1. from tkinter import *然後Label()Tk()
  2. import tkinter然後tkinter.Label()tkinter.Tk()
  3. import tkinter as tk然後tk.Label()

什麼是最好的方法?我看到第一個是最短的。這也是最好的嗎?

+0

@ martijn-pieters這個答案對我的問題的第一部分是非常好的。我認爲這個問題的第一部分回答了。但其第二部分仍然沒有答案。我是否應該刪除該帖子並創建一個新帖子或編輯帖子以僅包含第二部分? –

回答

1

我會盡量回答你的問題的第二部分。

  1. from tkinter import *然後Label()Tk() 這是considerd不好的做法,因爲它混合了命名空間和可能混淆你的代碼的未來讀者。例如,許多模塊具有功能sqrt(標準庫math,numpy,scipy)。如果你使用全部導入(*)爲其中幾個,最後一個會贏。有時候一個模塊的功能會覆蓋標準的python函數,讀者不知道這個特定函數來自哪裏。即使你只在一個模塊上使用import-all,閱讀器也必須區分標準的python函數和包函數,例如getint from tkinter?他爲什麼使用NONE而不是None等。這應該只用於解釋器上的交互式工作。

  2. import tkinter然後tkinter.Label()tkinter.Tk() 這是最明確的(並記住explicit is better than implicit),但它是一個有點長。

  3. import tkinter as tk然後tk.Label()? 這是1和2之間的一個很好的折衷。簡短但明確。

所以你如果你經常使用的包2和3之間做出選擇,它有一個明顯的短名稱(如tkinter -> tknumpy -> np)我會使用短名稱。

+0

我相信我在某個地方(effbot.org和網頁鏈接那裏)讀取tkinter被設計爲從tkinter import *'導入沒有問題,但由於我無法找到該帖子,並且自從我讀了很多其他反對的帖子這樣的進口,我接受你的答案。 –

+0

@love_in_dreams:沒有辦法設計任何python包以這種方式導入而不會導致問題。將事物導入全球範圍的性質將永遠具有潛在的問題。 Tkinter特別容易受到影響,因爲人們經常一起使用tkinter和ttk,並且他們都擁有名爲Button,Label等的類。 –

+0

好的,這要感謝你們倆。我猜我們都很懶,因爲我沒有看到很多使用正確方法的人/例子。無論如何,使用短名確實看起來是最好的方式,對於生產代碼來說。 –

相關問題