我认为这是一个合理的解决方案。您的解析器不仅仅是导入 django.contrib.messages,它还在决定用于消息传递的整个 API。通过传入模块,您实际上是在传入整个 API。您将拥有一堆 if 语句,它们根据某种配置参数有条件地进行消息传递。该参数可以是 djang.contrib.messages 模块本身,也可以是一些表示要进行消息传递的标志。我更喜欢后者,因为让调用者导入模块有点尴尬。
class Parser(object):
def __init__(self, use_messaging=False):
if use_messaging:
try:
self.messages = __import__('django.contrib.messages')
except ImportError:
print "dude, you really need to read the help secton"
sys.exit(1)
else:
self.messages = None
def parse(self):
if self.messages:
self.messages.send_message("I am parsing now")
您可以使用配置文件变得更有趣,以便消息不是由调用者而是由应用程序本身的配置可选地启用的。这是有道理的,因为您必须在某个地方配置向谁发送消息。但是基本概念很好。
@DaniaelRoseman 对依赖注入有一个有效的担忧,但我认为它只是安装时的一个问题(例如,您可以为不同的产品编写不同的 pip 要求规则)并且应该很容易解决。