“import module; import module as blah”和“import module; blah=module”之间有什么有意义的区别吗?

问题描述 投票:0回答:1

这个问题只是为了我对Python模块的理解。

我很好奇除了可读性之外,这两行之间是否有任何有意义的差异:

import module ; import module as blah

import module ; blah = module

python python-import python-module
1个回答
0
投票

它们是相同的并产生相同的模块对象:

import pathlib as p1

import pathlib
p2 = pathlib

assert p1 is p2
assert p1 == p2
for attr in dir(p1):
    assert getattr(p1, attr) == getattr(p2, attr)
for attr in dir(p2):
    assert getattr(p1, attr) == getattr(p2, attr)

以上适用于 CPython 3.11 和 PyPy 3.10 (v7.3.12)。

特别是在 CPython 中,带有

as
的版本使用更少的字节码操作:

Python 3.11.6 (main, Oct  2 2023, 17:46:45) [Clang 13.1.6 (clang-1316.0.21.2.5)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.14.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: def g():
   ...:     import pathlib as p2
   ...:     return p2
   ...:

In [2]: def f():
   ...:     import pathlib
   ...:     p1 = pathlib
   ...:     return p1
   ...:

In [3]: dis(g)
  1           0 RESUME                   0

  2           2 LOAD_CONST               1 (0)
              4 LOAD_CONST               0 (None)
              6 IMPORT_NAME              0 (pathlib)
              8 STORE_FAST               0 (p2)

  3          10 LOAD_FAST                0 (p2)
             12 RETURN_VALUE

In [4]: dis(f)
  1           0 RESUME                   0

  2           2 LOAD_CONST               1 (0)
              4 LOAD_CONST               0 (None)
              6 IMPORT_NAME              0 (pathlib)
              8 STORE_FAST               0 (pathlib)

  3          10 LOAD_FAST                0 (pathlib)
             12 STORE_FAST               1 (p1)

  4          14 LOAD_FAST                1 (p1)
             16 RETURN_VALUE

但是这种差异在任何实际使用中都不应该明显。

请注意,您不需要在

import module
之前写
import module as foo
。在
import
的每种形式中,模块都会被完整加载并以其原始名称存储在内存中。

© www.soinside.com 2019 - 2024. All rights reserved.