关于import:将python模块导入例程或类定义有什么问题吗?

Is there anything wrong with importing a python module into a routine or class definition?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Should Python import statements always be at the top of a module?

我最近回答了一个这样的问题,并提供了一个解决方案:

1
2
3
4
5
6
7
8
9
10
def set_fontsize(fig,fontsize):
    import matplotlib
   """
    For each text object of a figure fig, set the font size to fontsize
   """

    if not isinstance(fig,matplotlib.figure.Figure):
        raise Exception("fig is not a matplotlib.figure.Figure")

    for textobj in fig.findobj(match=matplotlib.text.Text):
        textobj.set_fontsize(fontsize)

我将matplotlib导入到set_fontsize(fig,fontsize)的定义中,因为不能保证使用此例程的人会在更全局的范围内导入matplotlib(更好的术语?).

我导入matplotlib是否会导致冲突?

有效率成本吗?

如果figmatplotlib.figure.Figure的实例,是否有更好/更常见的测试替代方案;不需要导入模块的替代方案?


在函数和类中导入没有任何错误——例如,这是一种处理相互递归导入(其中两个文件彼此导入对方)的有用方法。

但是,检查参数类型有问题。惯用的python不会检查fig的类型,而是让误用在任何失败的地方都失败。这是因为你打破了"duck-typing"——人们不能用"像"fig一样工作的对象来调用你的例程,即使他们想这样做(一个明显的例子是测试模拟;另一个例子是某人编写了一个Matplotlib的替代品,它具有相同的API,但看起来或工作得更好)。

因此,对于您所拥有的代码,完全不需要进行导入。只需使用fig

更一般地说,导入在第一次使用时会被缓存,所以您通常不需要太担心效率(我并不是说它是完美的,但这是您在担心之前需要先分析的一种东西)。


在函数内部导入没有什么特别的错误——尽管您应该在docstring之后进行导入,否则python将看不到docstring——但是您的推理没有任何意义。

如果您在模块级别导入,并且有人导入您的函数,那么该函数可以访问其模块中的所有内容,包括导入。您的函数的用户不需要专门导入任何内容。