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

将python模块导入例程或类定义中有什么问题吗?,python,import,module,instance,Python,Import,Module,Instance,可能重复: 我最近回答了一个问题,并提供了此例程作为解决方案: 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 Exceptio

可能重复:

我最近回答了一个问题,并提供了此例程作为解决方案:

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(图,fontsize)
的定义中,因为不能保证使用此例程的人会在更全局的范围(更好的术语?)导入matplotlib。尤其是由于许多matplotlib示例使用此导入调用例程:
import matplotlib.pyplot as plt

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

有效率成本吗


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

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


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

导入内部函数和类没有什么错-例如,它是处理相互递归导入(其中两个文件彼此导入)的一种有用方法

但是,检查参数的类型有问题。惯用python不会检查fig.的类型,而是让误用在失败的地方失败。这是因为您正在打破“duck typing”(duck typing)——人们无法使用“工作方式类似于”fig的对象调用您的例程,即使他们愿意(一个明显的例子是测试mock;另一个例子是有人编写了matplotlib的替代品,该替代品具有相同的API,但外观或工作方式更好)

因此,对于那里的代码,根本不需要导入。只需使用


更一般地说,导入在第一次使用时是缓存的,因此您通常不需要太担心效率(我不是说它是完美的,但这是您在担心之前需要分析的事情)。

@carl,这个问题及其答案几乎涵盖了我的问题。谢谢你解释为什么不检查论点的类型。我想我仍然需要在某个地方导入对findobj的调用,该调用需要知道
matplotlib.text.text
。这可能不重要,但我找到了解决方法。通过检查
\uuuu module\uuu
的值,我可以查看fig的每个子模块是否驻留在“matplotlib.text”模块中。我根本不需要导入,但您的回答提供了大量信息。非常感谢。