2 回答

TA貢獻1802條經驗 獲得超6個贊
好的,基于這個想法:
奧斯汀菲爾普的回答
# services/__init__.py
from .service1 import service1
from .service2 import service2
...
services = [service1, service2, ...]
__all__ = ['services']
在這個答案中提到的工廠模式中特別公開的方法和模塊的想法,我想出了一個非常hacky的解決方案,它不會使全局命名空間混亂(@Austin Philp 批評的另一件事)。
解決方案
我有了在每個模塊中實現一個方法的想法,該方法除了創建所述模塊的實例之外什么都不做,并且每個模塊都在以下內容中提到services/__init__.py:
#services/__init__.py
from .service1 import service1
from .service2 import service2
__all__=["service1", "service2", ...]
#services/service1.py
class service1(object):
def __init__(self, input):
...
...
#
def create_instance(input):
return service1(input) # create the object and return it.
然后在 main.py 中,我只是這樣做(它非常hacky,但它有效)
#main.py
import services
import sys
# use the __all__ method to get module names. actually
for name in services.__all__:
service = sys.modules[f'services.{name}'].create_instance( input )
# do whatever with service
這樣我就可以愉快地做任何需要的事情,而不會弄亂全局命名空間,但仍然可以迭代甚至單獨調用模塊。要添加/刪除模塊,我唯一需要編輯的是__all__內部變量中的另一個條目services/__init__.py。它甚至消除了對serv_arr數組的需要,因為services.__all__已經有了我感興趣的所有名稱,并且與使用的模塊具有相同的長度。

TA貢獻1111條經驗 獲得超0個贊
首先,您應該真正避免使用該from xxx import *模式,因為它會使全局命名空間變得混亂。
您可以將可用服務列表添加到services/__init__.py
像這樣的東西
# services/__init__.py
from .service1 import service1
from .service2 import service2
...
services = [service1, service2, ...]
__all__ = ['services']
如果這對您來說仍然過于手動,您可以遍歷目錄并使用importlib它們的路徑導入服務。
但是,我不禁認為這個問題表明設計不好。您可能需要考慮使用類似工廠模式的東西來實例化各種服務,而不是使用大量單獨的模塊。實際上,如果您想對所有服務進行小幅更改,那么您將面臨許多繁瑣的工作。
添加回答
舉報