以下“import”语句是否等效于Python3中的“import mypack.mymod”和“from mypack import mymod”?
以下以下“import”语句是否等效于Python3中的“import mypack.mymod”和“from mypack import mymod”?,python,python-3.x,Python,Python 3.x,以下import语句是否等效:import mypack.mymod和在Python3中从mypack导入mymod 假设我有以下目录层次结构: . ├── main.py └── mypack ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ └── mymod.cpython-37.pyc └── mymod.py 在main.py中导入mymod模块时,impor
import
语句是否等效:import mypack.mymod
和在Python3中从mypack导入mymod
假设我有以下目录层次结构:
.
├── main.py
└── mypack
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ └── mymod.cpython-37.pyc
└── mymod.py
在
main.py
中导入mymod
模块时,import mypack.mymod
和from mypack import mymod
语句是否等效?我一直在尝试这两种方法,它们似乎执行完全相同的工作。这两个语句导入相同的模块,但通过不同的标识符使其可访问。我将给出使用os.path
模块的示例:
import os.path
# Try accessing os.path.realpath
try:
rp = os.path.realpath(".")
except NameError:
print("!! Cannot access os.path")
else:
print("OK", rp)
# Try accessing path.realpath
try:
rp = path.realpath(".")
except NameError:
print("!! Cannot access path")
else:
print("OK", rp)
这将产生:
OK C:\Users\ME\Documents
!! Cannot access path
将第一行中的导入更改为:
from os import path
输出切换到:
!! Cannot access os.path
OK C:\Users\ME\Documents
区别在于w.r.t包在
main.py
中的可用性。让我们采取三种可能的方式:
假设dir结构与您的相同,并且mymod.py
案例1: 这导致
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar
案例2: 这导致
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar
案例3: 这导致
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar
观察:
正如您在打印
dirs
时所看到的,案例1中的模块可用作mymod
&因此您使用foo
作为mymod.foo
,在案例2中作为mypack
&因此要使用foo
您现在必须使用mypack.mymod.foo
,最后在案例3中作为md
&要使用foo
,您现在必须使用md.foo它们导入相同的模块,但它们以不同的名称导入到您的脚本中…!你所说的等价物是什么意思?应该可以立即观察到,它们将模块绑定到不同的名称,因此不是等价的。这是否回答了您的问题?