如何在函数内导入模块使代码更加模块化?

时间:2016-03-05 08:17:39

标签: python oop module python-import modular-design

来自Dive into Python

  

您已经习惯在程序顶部看到导入语句,而这些语句位于程序的顶部   表示导入的模块在程序中的任何位置都可用。   但您也可以在函数中导入模块,这意味着   导入的模块仅在该功能中可用。如果你有   一个只在一个函数中使用的模块,这是一种简单的方法   使您的代码更加模块化。

在功能级别导入模块的另一种方法是在模块级别导入它(函数是其中的一部分)。

由于模块是可重复使用的单元,前一个选项如何增加模块化?

1 个答案:

答案 0 :(得分:1)

我不相信在功能级别导入更模块化。从Python中的模块导入函数(或类)将解析库依赖关系,并且这些导入的函数无需导入相同的库即可工作。

(注意:我使用库来避免每隔一个词说出模块)

示例:

my_module.py

import sys

def printerr(message):
    """Use stderr for error messages"""
    sys.stderr.write('{0}\n'.format(message))
    sys.stderr.flush()

my_script.py

import os

from my_module import printerr


def main():
    """Derpy script"""
    if 'my_important_file.txt' in os.listdir():
        print("it's there")
    else:
        printerr("ERROR: Unable to find important file")

鉴于此,这是一个极其简化的示例,但在打印机内导入sys不会使其更加模块化。无论如何,它都是模块化的。

根据我的经验,可以而且确实出现的问题与模块化方面的技术债务积累有关。

首先,你有一个简单的模块,它明确地知道它的作用。在该模块中导入的库是有意义的,并且在其中的函数/类中高度使用。

随着时间的推移,功能被添加,我们通常只是添加新的功能/类,并且最适合"模块(即"我想把它放在这里是有道理的?")。

时间越来越长,一个更好的图书馆越来越受欢迎,所以我会使用那个,但我真的不想花几个星期来替换所有旧代码(就像我有那种时间,我有事要做!)。

不久之后,你会有一些代码导入20个东西并且做得很多。当然没有单元测试,所以每当你触摸它时,你会破坏一些东西,但需要一个星期才能找到...

现在你厌倦了处理这个,所以搞砸了,我只是在我使用它的函数中导入我想要的东西;这比处理大约20个进口容易。

在功能中导入的一个非常令人信服的理由如下所示:

def doh():
    import nothing
    print "Homer says..."

这是你刚刚发送的一个错误,因为在你的单元测试中,doh从未被调用过,但它以一种你没有想到的奇怪方式被调用。 "如果我只是像PEP8那样导入,我就不会有这个问题。"