将python模块传递给函数

时间:2013-09-27 15:38:30

标签: python parameter-passing

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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需求规则),并且应该很容易解决。