05_模块(import & from)

模块(import & from)

导入模块

在和.py同级文件夹下创建一个自定义的模块

image-20250228213404529

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()
  1. import module_name

    import fibo
    
    list = fibo.fib_return(500)
    print(list)
    
  2. from module_name import item

    from fibo import fib_no_return, fib_return
    
    fib_no_return(500)
    
  3. 使用 as

    import 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同级文件夹中新建一个文件夹

image-20250228214257672
  1. 导入单个模块 import package

    使用模块中的函数必须引用其全名

    import my_math.fibonacci.fibo
    
    my_math.fibonacci.fibo.fib_no_return(500)
    
  2. 另一种导入方法: from package import item

    from my_math.fibonacci import fibo as fib
    
    fib.fib_no_return(500)
    
  3. 使用 as

    from 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
posted @ 2025-02-28 21:54  静香还需努力  阅读(17)  评论(0)    收藏  举报