2017-03-17 119 views
0

假設我有一個模塊rules結構如下:在Python中,如何從__init__.py中導入在同一目錄

rules 
├── conditions.py 
├── __init__.py 

在腳本conditions.py,我想導入一個名爲類在__init__.py中定義的RuleParserError。但是,我一直無法弄清楚如何做到這一點。 (繼Python: How to import from an __init__.py file?我試過

from . import RuleParserError 

但這種嘗試運行conditions.py__main__時導致了ImportError: cannot import name RuleParserError)。

回答

1

我看到'從父模塊導入'作爲Python中的反模式。進口應該是相反的方式。從模塊的__init__.py導入尤其成問題。如您注意到的,從foo/bar.py導入模塊foo.bar涉及首先導入foo/__init__.py,並且您最終可能會產生循環依賴。將print __name__添加到init文件有助於查看順序並理解問題。

我建議你移動你想要從__init__.pyconditions.py導入到一個單獨的低級別的模塊,只是從該模塊導入一些名字在__init__.py在更高層次暴露出它的代碼。

假設您的__init__.py中有一些class Bar。我會按以下方式重新組織它。

__init__.py

from bar import Bar # exposed at the higher level, as it used to be. 

bar.py

class Bar(object): ... 

conditions.py

from . import Bar # Now it works. 

理想的__init__.py應該包含什麼,但由較低級別的模塊,或者什麼都沒有進口。

相關問題