您已经习惯在程序顶部看到导入语句,而这些语句位于程序的顶部 表示导入的模块在程序中的任何位置都可用。 但您也可以在函数中导入模块,这意味着 导入的模块仅在该功能中可用。如果你有 一个只在一个函数中使用的模块,这是一种简单的方法 使您的代码更加模块化。
在功能级别导入模块的另一种方法是在模块级别导入它(函数是其中的一部分)。
由于模块是可重复使用的单元,前一个选项如何增加模块化?
答案 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那样导入,我就不会有这个问题。"