Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python模块传递给函数_Python_Parameter Passing - Fatal编程技术网

将python模块传递给函数

将python模块传递给函数,python,parameter-passing,Python,Parameter Passing,在python中将模块作为参数传递到函数中有意义吗 我的python意识认为这个想法是错误的,但我不确定确切的原因 这就是我遇到它的地方。我正在使用Django的消息传递框架Django.contrib.messages。我还使用了一个为其他目的编写的解析模块,并从中导入一个类到django应用程序中。然后我意识到我想在解析过程中设置消息 解析模块根本不依赖于Django,我不希望在解析模块中导入Django,因为这会引入依赖关系 我认为正确的答案是将django的条件导入添加到解析模块中 但是

在python中将模块作为参数传递到函数中有意义吗

我的python意识认为这个想法是错误的,但我不确定确切的原因

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

解析模块根本不依赖于Django,我不希望在解析模块中导入Django,因为这会引入依赖关系

我认为正确的答案是将django的条件导入添加到解析模块中


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

我认为这是一个合理的解决方案。您的解析器不仅仅是导入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")
您可以使用一个配置文件来获得fancier,这样就可以选择不通过调用方而是通过应用程序本身的配置来启用消息传递。这是有道理的,因为在这条线路的某个地方,您必须配置向谁发送消息。但基本概念是好的


@DaniaelRoseman对依赖项注入有一个合理的担忧,但我认为这只是安装方面的担忧(例如,您可以为不同的产品编写不同的pip需求规则),应该很容易解决。

您谈论的是依赖项注入,这在Python中是一个困难的主题。很少有两个模块具有相同的接口,所以这通常没有意义。既然你被锁定在界面上,那么你也可以锁定到特定的模块。@MarkRansom,我想我明白你的意思了,但我在一个不需要django的桌面应用程序中也使用了相同的解析模块,我希望其他人会在未来的应用程序中使用解析模块。这将是一个“两个模块具有相同接口”的例子,对吗?也许我误解了这个问题。您传递的是两个不同模块之间的选择,还是单个模块和
None
之间的选择?单个模块和
None
之间的选择。我想修复您的“its”,但它不允许您编辑以插入两个撇号!很高兴知道,如果我按自己的方式做,我就不会反对python。use_messaging flag方法看起来确实更好。@foobrabby-我一直把收缩和所有格混淆在一起。嘿嘿,真不幸。至于我,我是完美的,从不犯任何错误。你错过了一个:“我想这只是一个问题”