在運行時,Python代碼獲取要加載的子模塊的名稱,這是我之前不知道的。現在,我想檢查一下,如果這個子模塊存在於現有的模塊中。考慮這樣的結構,其中foo
和bar
可以指定:如何使用hasattr在Python中檢查子模塊
master/
|
|- __init__.py
|
|- foo/
| |
| |- __init__.py
|
|- bar/
|
|- __init__.py
現在,通常我這樣做,它適用於DEFS和變量:
import master
unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
pass # all's well
或我趕上了AttributeError異常,它的工作原理一樣。
但是,對於上述文件結構,我無法使這種方法起作用。 hasattr()
總是返回False(即總是拋出AttributeError)。
如果我看dir(master)
,我看到這樣的輸出:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
甚至明確規定__all__
在master/__init__.py
沒有幫助,但改變了目錄()來
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
任何想法,我做錯了什麼,或者是否有辦法實現這些測試? (順便說一句:Python的2.6贏/ Cygwin的,如果這是任何權益)
你對'明確陳述'有什麼意思?我想,這就是'__all__'的作用?你有沒有碰到有用的解釋? (除了http://docs.python.org/tutorial/modules.html或http://effbot.org/zone/import-confusion.htm) 除此之外,是的'__import __()'做什麼是請求。 – Boldewyn 2010-07-13 13:15:43
不,'__all__'決定了當你從'import *'說'時輸入的內容。但這與你的問題無關。如果你有一個模塊'A'和一個模塊'A.B',那麼只有當'A'本身導入'A.B'時,導入'A'纔會奇蹟般地將一個成員'B'添加到'A'。要訪問'A.B',你必須導入'A.B',而不是'A'。在'os.path'中導入'os'是可行的,因爲'os'不會主動導入'os.path'。 – Philipp 2010-07-13 13:50:57
感謝您的解釋!我想我開始掌握這個問題。 – Boldewyn 2010-07-13 14:11:14