Python 內建函å¼è£¡æœ‰ä¸€å€‹ __import__(),å¯ä»¥ç”¨ä¾†è‡ªè¨‚ package/module 的匯入 (import) 動作。Django 就利用這個函å¼ä¾†å–å¾— DJANGO_SETTINGS_MODULE 和其它相關的功能模組。
當我們è¦åœ¨ç¨‹å¼è£¡é¢è¨è¨ˆå¯é¸æ“‡çš„組件 (plugin) 時,讓它們被 __import__() å‹•æ…‹è¼‰å…¥æ˜¯è »ç†æƒ³çš„æ–¹æ³•。Python å®˜æ–¹æ–‡ä»¶è£¡å° __import__() 的介紹就給了一個剛好é©ç”¨çš„範例:
def my_import(name): mod = __import__(name) components = name.split('.') for comp in components[1:]: mod = getattr(mod, comp) return mod
把模組的å稱å—串 name 丟進 my_import() 去,就å¯ä»¥å¾—到該å—串所指涉的模組。這和一般所用的 import mod1.mod2 有什麼ä¸ä¸€æ¨£å‘¢ï¼Ÿæˆ‘們寫:
import mod1.mod2
所得到的是一個 mod1 å稱,這個敘述會把 mod1 æ¨¡çµ„åŠ é€²ç•¶å‰çš„命å空間ä¸ï¼ŒåŒæ™‚把 mod2 åŠ é€² mod1 模組的命å空間;實際上,在當å‰çš„命å空間ä¸å¾—到的是 mod1 é€™å€‹æ¨¡çµ„ï¼Œè€Œä¸æ˜¯ mod2 。
my_import() ä¸ä¸€æ¨£ï¼Œç•¶æˆ‘們寫:
wantedmod = my_import( 'mod1.mod2' )
會把當å‰å‘½å空間的 wantedmod 變數指定為 mod2 這一個模組。或者,也å¯ä»¥ç›´æŽ¥æ“作 my_import() 傳回的模組物件:
my_import( 'mod1.mod2' ).some_func_in_mod2()
ç•¶ç„¶ï¼Œå¦‚æžœæˆ‘å€‘åªæ˜¯æƒ³è¦èƒ½å¤ 比較方便地 mod2 這個模組,那麼:
from mod1 import mod2
或:
from mod1 import mod2 as wantedmod
都å¯ä»¥é”æˆä»»å‹™ã€‚使用 __import__() çš„é‡è¦æ€§åœ¨æ–¼ï¼Œå®ƒå¯ä»¥åœ¨åŸ·è¡ŒæœŸæ±ºå®šè¦åŒ¯å…¥çš„æ¨¡çµ„,ä¸åƒ import å’Œ from foo import bar,撰寫程å¼çš„æ™‚å€™ä¸€å®šè¦æŠŠæ¨¡çµ„å稱寫æ»ã€‚
還想弄些更奇怪的æ“作?請使用 imp æ¨¡çµ„ä¾†è®Šé”æ³•。
- Previous: Python 2.5 alpha1 帶有 sqlite3 æ”¯æ´ @2006/04/06
- Next: Falsity @2006/04/07
Please send trackback to: http://blog.seety.org/everydaywork/2006/4/6/495/trackback/.