05_模块(import & from)
模块(import & from)
导入模块
在和.py同级文件夹下创建一个自定义的模块
fibo.py
def fib_return(x):
a, b = 0, 1
result = []
while a < x:
result.append(a)
a, b = b, a + b
return result
def fib_no_return(x):
a, b = 0, 1
while a < x:
print(a, end=' ')
a, b = b, a + b
print()
-
import module_name
import fibo list = fibo.fib_return(500) print(list) -
from module_name import item
from fibo import fib_no_return, fib_return fib_no_return(500) -
使用
asimport fibo as fibonacci fibonacci.fib_no_return(500) from fibo import fib_no_return as fib fib(500)
dir()函数
内置函数 dir() 用于查找模块定义的名称。返回结果是经过排序的字符串列表:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__',
'__interactivehook__', '__loader__', '__name__', '__package__', '__spec__',
'__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework',
'_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook',
'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix',
'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing',
'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth',
'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value',
'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix',
'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr',
'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info',
'warnoptions']
没有参数时,dir() 列出当前已定义的名称:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
包
在.py同级文件夹中新建一个文件夹
-
导入单个模块 import package
使用模块中的函数必须引用其全名
import my_math.fibonacci.fibo my_math.fibonacci.fibo.fib_no_return(500) -
另一种导入方法: from package import item
from my_math.fibonacci import fibo as fib fib.fib_no_return(500) -
使用
asfrom my_math.fibonacci.fibo import fib_no_return as fib fib(500)
从包中导入*
使用
from sound.effects import *时会发生什么?你可能希望它会查找并导入包的所有子模块,但事实并非如此。因为这将花费很长的时间,并且可能会产生你不想要的副作用,如果这种副作用被你设计为只有在导入某个特定的子模块时才应该发生。
唯一的解决办法是提供包的显式索引。
import语句使用如下惯例:如果包的__init__.py代码定义了列表__all__,运行from package import *时,它就是被导入的模块名列表。发布包的新版本时,包的作者应更新此列表。如果包的作者认为没有必要在包中执行导入 * 操作,也可以不提供此列表。例如,sound/effects/__init__.py文件可以包含以下代码:
__all__ = ["echo", "surround", "reverse"]
这意味着 from sound.effects import * 将导入 sound.effects 包的三个命名子模块。
相对导入
当包由多个子包构成(如示例中的
sound包)时,可以使用绝对导入来引用同级包的子模块。 例如,如果sound.filters.vocoder模块需要使用sound.effects包中的echo模块,它可以使用from sound.effects import echo。
你还可以编写相对导入代码,即使用
from module import name形式的 import 语句。 这些导入使用前导点号来表示相对导入所涉及的当前包和上级包。 例如对于surround模块,可以使用:
from . import echo
from .. import formats
from ..filters import equalizer
浙公网安备 33010602011771号