2012年4月29日 星期日

python import 需要注意的問題



**平台的import麻煩點
Mac,Windows 平台下:檔案的名稱大小寫並不統一。
所以在這些平台之上,我們並無法保證 ECHO.PY 這個檔案應該被import成 echoEcho 或 ECHO (例如,Windows 95 有一個惱人的特點,就是會自動把所有的檔案名稱第一個字元大寫)。


DOS的 8+3 檔名限制對長的module名稱


**定義__all__的必要性

如果沒有定義 __all__ 的話, from Sound.Effects import * 這個敘述就 不會 從 Sound.Effects 這個package裡面import所有的module進入目前的命名空間(namespace)。唯一能保證的是 Sound.Effects 這個package有被imported 進來(可能會執行 __init__.py 裡面的初始化程式碼),並且這個package裡面所定義的名稱會被import進來。Package裡所定義的名稱包含了在 __init__.py 裡面所定義的名稱(以及所import的module)。當然也包含了在之前用import引進來的module名稱,例如:



Sound/                          Top-level package
      __init__.py               Initialize the sound package
      Formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      Effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      Filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...



在這個例子裡,echo以及 surround 這兩個modules 都會被 import進來目前的命名空間(namespace)裡。這是因為當 from...import 這個敘述執行的時候,這兩個module都已經在這個package中有定義了(你也可以用 __all__ 來定義)。值得注意的是使

  1. 用import * 這樣的寫法常常是不被鼓勵的=>可讀性
  2.  from Package import specific_submodule =>推薦使用的形式。
  3. 上面的 __init__.py 這個檔是必須要的=>避免直譯器誤認module
  4. 在__init__.py文件中定義__all__ = ["echo", "surround", "reverse"]



為使Python能把這個目錄架構當作是一個package,上面的 __init__.py 這個檔是必須要的。這是為了要避免有些檔案目錄的名字是很普通的名字(例如 "string" ),這會讓直譯器誤認正確的module名稱而找不到在搜尋路徑中的module。在最簡單的例子裡, __init__.py 可以是一個空的檔案。但是你也可以讓這個檔來做一些package初始化的動作,或者設定 __all__ 這個變數(稍後會再提)。

沒有留言:

張貼留言