我不相信在功能级别导入更模块化。从 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 说的那样导入,我就不会有这个问题了。”