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

时间:2011-08-16 19:26:51

标签: python import module instance

  

可能重复:
  Should Python import statements always be at the top of a module?

我最近回答了SO question并提供了此例程作为解决方案:

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示例使用此导入调用例程:import matplotlib.pyplot as plt

是否存在导入matplotlib导致冲突的情况?

是否有任何效率成本?

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

2 个答案:

答案 0 :(得分:2)

导入内部函数和类没有任何问题 - 例如,它是处理相互递归导入(其中两个文件都导入另一个)的有用方法。

然而, 检查参数的类型是错误的。惯用的python将检查无花果的类型。相反,只要误操作失败就会失败。这是因为你正在打破“鸭子打字” - 人们不能用“无形”工作的对象调用你的例程,即使他们想要(一个明显的例子是测试模拟;另一个例子是有人写matplotlib的替代品,有相同的API,但看起来或效果更好)。

所以,对于那里的代码,没有必要进行导入。只需使用fig

更一般地说,导入在首次使用时会被缓存,因此您通常不需要担心效率(我不是说它很完美,但在担心之前需要对其进行分析)。< / p>

答案 1 :(得分:1)

在函数内部导入没有什么特别的错误 - 尽管你应该在docstring之后执行它,否则Python将看不到文档字符串 - 但你的推理没有任何意义。

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