3

将模块作为参数传递给 python 中的函数是否有意义?

我的 python-sense 说这个想法是错误的,但我不确定为什么。

这是我遇到它的地方。我正在使用 Django 的消息传递框架 django.contrib.messages 。我还使用了一个为其他目的编写的解析模块,并将一个类从中导入到我的 django 应用程序中。然后我意识到我想在解析过程中设置消息。

解析模块根本不依赖Django,我宁愿不在解析模块中导入django,因为那样会引入依赖。

我想这里的正确答案是将 django 的条件导入添加到解析模块中。

但后来我想:为什么我不能让我在解析模块中使用的类接受消息模块作为可选参数?

4

1 回答 1

1

我认为这是一个合理的解决方案。您的解析器不仅仅是导入 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 要求规则)并且应该很容易解决。

于 2013-09-27T16:47:16.027 回答