簡體   English   中英

如何將Python代碼構建到模塊/包中?

[英]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.

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