2012-04-28 91 views
5

我有一些代碼,看起來像這樣:限制Python的範圍導入

from pyparsing import Word, alphas, Optional, ... 
# Do stuff ... 
# And at the end, save a result to the outside world. 
parser = ... 

# Now use parser but don't use anything else from pyparsing again. 

我喜歡有打電話from <package> import <etc>的方便,但我只希望它的代碼非常小部分被使用。恐怕我會對命名空間污染做出貢獻,因爲我在同一個文件中有許多這樣的小片段。

什麼是Pythonic處理這種情況的方式?我仍然只是玩弄它,所以我寧願不寫和重寫pyparsing.很多次。

回答

7

一個簡單的方法是使用功能範圍,在一個文件中控制進口的知名度:

def prepare_parser(): 
    from pyparsing import Word, alphas, Optional, ... 
    # do stuff, and get the final thing to return 
    return ... 

parser = prepare_parser() 
+3

該技術的工作原理很簡單,但很少見,許多開發人員會對使用函數從全局範圍隱藏導入的做法感到畏懼。總之,我不確定這應該是一個推薦的做法。將函數放入函數通常只會在導入需要延遲的情況下完成(在調用函數時進行導入,而不是在加載模塊時執行導入)。我指出了這一點,因爲OP正在要求Pythonic的做法 - 還有其他技術可以在不本地化進口的情況下完成工作。 – 2012-04-28 04:23:23

+2

@RaymondHettinger我的印象是,大多數開發人員根本就懶得隱藏全球範圍內的進口商品。 (主要或者只是處理命名空間中的額外值,或者導入模塊並使用'.0.''符號,可能帶有as as aliasing。) – Amber 2012-04-28 04:24:14

+2

這真的取決於您是否期望用戶運行''help(yourmodule )''或''dir(yourmodule)''來發現API。這兩種API發現技術都受名稱空間混亂的影響。 – 2012-04-28 04:28:55

11

通常的方式來控制命名空間的污染是

  1. 使用
  2. 使用後刪除變量__all__變量
  3. 使用導入 - 對於下劃線的變量名稱

這些技術全部由標準庫中的核心開發人員使用。例如,小數模塊:

綜合起來,這些技術使命名空間保持清潔,像哨子一樣。