[英]How do I structure Python code into modules/packages?
假設我有這個准系統結構:
project/
main.py
providers/
__init.py__
acme1.py
acme2.py
acme3.py
acme4.py
acme5.py
acme6.py
假設main.py
包含(部分):
if complexcondition():
print providers.acme5.get()
__init__.py
為空且acme*.py
包含(部分):
def get():
value=complexcalculation()
return value
如何更改這些文件?
注意:如果答案是“import acme1”,“import acme2”,依此類推__init__.py
,有沒有辦法實現這一點而不用手動列出所有內容?
嘿! 兩年后但......可能對某人有所幫助
使你的provider / __ init__.py像那樣:
import os
import glob
module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]
如果添加或刪除任何provider / acme * .py,您不必在以后更改它
然后在main.py中使用from providers import *
如果我正確地閱讀你的問題,看起來你似乎沒有嘗試進行任何動態導入(比如Van Gale提到的問題),但實際上是在嘗試只導入provider包中的所有模塊。 如果是這種情況,在__init__.py
你會想要這個聲明:
__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]
然后導入您將使用的所有內容... import *
from providers import *
然后,您只需調用導入的類,而不是在代碼中顯式使用包名稱
acme1.get()
acme2.get()
如果在提供程序包中有足夠的模塊,填充__all__
列表就會出現問題,您可能需要考慮將它們分解為更小的包或以其他方式存儲數據。 我個人不希望每次我想重新使用包時都要處理動態導入schennagins。
今天提出的這個問題,Python模塊的動態加載 ,應該有你的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.