簡體   English   中英

Python按文件夾模塊導入

[英]Python imports by folder module

我有一個目錄結構:

example.py
templates/
    __init__.py
    a.py
    b.py

a.pyb.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)在這種特殊情況下它也避免了事故(例如,某些子模塊可能定義了一個命名thismodmodnames ...所以將我們在循環中使用的那些名稱保留在函數的本地, 而不是模塊全局,這樣它們就不會被意外踩踏;-)。

如果要強制執行名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM