【问题标题】:How does importing a module inside a function make code more modular? [closed]在函数中导入模块如何使代码更加模块化? [关闭]
【发布时间】:2016-03-05 08:17:38
【问题描述】:

来自Dive into Python

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

在函数级别导入模块的另一种选择是在模块级别(函数是其中的一部分)导入它。

既然模块是可重复使用的单元,那么前一个选项如何增加模块化?

【问题讨论】:

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


【解决方案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 说的那样导入,我就不会有这个问题了。”

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多