导入import的多种形式

参考资料:anaconda官方资料

一、module(模块)

比如fibo是个模块(.py文件),其中有fib、fib2等函数

第一种形式:import fibo

在当前的符号表中,这并不会直接进入到定义在 fibo 函数内的名称;它只是进入到模块名 fibo 中。你可以用模块名访问这些函数:

fibo.fib(1000)
fibo.fib2(100)
如果你想经常使用某个函数,你可以把它赋值给一个局部变量:
fib = fibo.fib
fib(500)

第二种形式:from fibo import fib, fib2

这并不会把被调模块名引入到局部变量表里(因此在这个例子里,fibo 是未被定义的)。

fib(500)

第三种形式:from fibo import *

可以导入模块内定义的所有名称。这会调入所有非以下划线(_)开头的名称。 在多数情况下,Python程序员都不会使用这个功能,因为它在解释器中引入了一组未知的名称,而它们很可能会覆盖一些你已经定义过的东西。

fib(500)

第四种形式:import fibo as fib

如果模块名称之后带有 as,则跟在 as 之后的名称将直接绑定到所导入的模块。这会和 import fibo 方式一样有效地调入模块, 唯一的区别是它以 fib 的名称存在的。

import fibo as fib
fib.fib(500)

第五种形式:from fibo import fib as fibonacci

注解:出于效率的考虑,每个模块在每个解释器会话中只被导入一次。因此,如果你更改了你的模块,则必须重新启动解释器, 或者,如果它只是一个要交互式地测试的模块,请使用 importlib.reload(),例如 import importlib; importlib.reload(modulename)

二、library(包)

比如有如下的包结构:

 

第一种形式:import sound.effects.echo

这会加载子模块 sound.effects.echo 。但引用它时必须使用它的全名。

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

第二种形式:from sound.effects import echo

这也会加载子模块 echo ,并使其在没有包前缀的情况下可用,因此可以按如下方式使用:

echo.echofilter(input, output, delay=0.7, atten=4)

第三种形式:直接导入所需的函数或变量:from sound.effects.echo import echofilter

这也会加载子模块 echo,但这会使其函数 echofilter() 直接可用:

echofilter(input, output, delay=0.7, atten=4)

第四种形式:从包中导入 *

当用户写 from sound.effects import * 会发生什么?理想情况下,人们希望这会以某种方式传递给文件系统,找到包中存在哪些子模块,并将它们全部导入。这可能需要很长时间,导入子模块可能会产生不必要的副作用,这种副作用只有在显式导入子模块时才会发生。

请注意,当使用 from package import item 时,item可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数,类或变量。 import 语句首先测试是否在包中定义了item;如果没有,它假定它是一个模块并尝试加载它。如果找不到它,则引发 ImportError 异常。

虽然某些模块被设计为在使用 import * 时只导出遵循某些模式的名称,但在生产代码中它仍然被认为是不好的做法。

请记住,使用 from package import specific_submodule 没有任何问题! 实际上,除非导入的模块需要使用来自不同包的同名子模块,否则这是推荐的表示法。

猜你喜欢

转载自www.cnblogs.com/ironan-liu/p/11972712.html