![](/img/trans.png)
[英]Python doesnt import module from the same folder it imports another
[英]Python imports by folder module
我有一個目錄結構:
example.py
templates/
__init__.py
a.py
b.py
a.py
和b.py
只有一個類,名稱與文件相同(因為它們是獵豹模板)。 出於純粹的樣式原因,我希望能夠在example.py
導入和使用這些類,如下所示:
import templates
t = templates.a()
現在我通過在模板文件夾的__init__.py
:
__all__ = ["a", "b"]
from . import *
然而,這似乎很差(也許是多余的),甚至沒有做我想要的,因為我必須使用這樣的類:
t = templates.a.a()
思考?
為避免重復from <whatever> import *
25次,您需要一個循環,例如:
import sys
def _allimports(modnames)
thismod = sys.modules[__name__]
for modname in modnames:
submodname = '%s.%s' % (thismod, modname)
__import__(submodname)
submod = sys.modules[submodname]
thismod.__dict__.update(submod.__dict__)
_allimports('a b c d e'.split()) # or whatever
我將有意義的代碼放在一個函數中,因為(a)它始終是最好的[[用於性能並避免污染模塊的命名空間]],(b)在這種特殊情況下它也避免了事故(例如,某些子模塊可能定義了一個命名thismod
或modnames
...所以將我們在循環中使用的那些名稱保留在函數的本地, 而不是模塊全局,這樣它們就不會被意外踩踏;-)。
如果要強制執行名為modname
的模塊只有一個具有相同名稱的類(或其他全局)的事實,請將循環的最后一個語句更改為:
setattr(thismod, modname, getattr(submod, modname))
在你的__init__.py
:
from a import *
from b import *
現在,所有的a
的內容將在templates
,如將所有的b
的內容。
我甚至都不知道你可以擁有from . import *
from . import *
。 我的python解釋器抱怨這樣的聲明。 不過,對於你的問題,你可以這樣做:
# __init__.py
from . import a, b
a = a.a
b = a.b
你現在可以使用了
# example.py
import templates
t = templates.a()
其他方案:
# __init__.py
from a import *
from b import *
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.