Mặc dù nhiều người đã giải thích về import
vs import from
, tôi muốn cố gắng giải thích thêm một chút về những gì xảy ra dưới mui xe và nơi tất cả những nơi nó thay đổi.
import foo
:
Nhập khẩu foo
và tạo một tham chiếu đến mô-đun đó trong không gian tên hiện tại. Sau đó, bạn cần xác định đường dẫn mô-đun đã hoàn thành để truy cập một thuộc tính hoặc phương thức cụ thể từ bên trong mô-đun.
Vd foo.bar
nhưng khôngbar
from foo import bar
:
Nhập khẩu foo
và tạo tài liệu tham khảo cho tất cả các thành viên được liệt kê ( bar
). Không đặt biến foo
.
Vd bar
nhưng không baz
hayfoo.baz
from foo import *
:
Nhập khẩu foo
và tạo tham chiếu đến tất cả các đối tượng công khai được xác định bởi mô-đun đó trong không gian tên hiện tại (mọi thứ được liệt kê trong __all__
nếu __all__
tồn tại, nếu không thì mọi thứ không bắt đầu bằng _
). Không đặt biến foo
.
Ví dụ bar
và baz
không _qux
hoặc foo._qux
.
Bây giờ hãy xem khi chúng ta làm import X.Y
:
>>> import sys
>>> import os.path
Kiểm tra sys.modules
với tên os
và os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
Kiểm tra globals()
và ký tự locals()
không gian tên với os
và os.path
:
>>> globals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> locals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> globals()['os.path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os.path'
>>>
Từ ví dụ trên, chúng tôi thấy rằng chỉ os
được chèn vào không gian tên cục bộ và toàn cầu. Vì vậy, chúng ta sẽ có thể sử dụng:
>>> os
<module 'os' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> os.path
<module 'posixpath' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
Nhưng không phải path
.
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Khi bạn xóa os
không gian tên từ locals (), bạn sẽ không thể truy cập os
cũng như os.path
mặc dù chúng tồn tại trong sys.modules:
>>> del locals()['os']
>>> os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
Bây giờ hãy nói về import from
:
from
:
>>> import sys
>>> from os import path
Kiểm tra sys.modules
với os
và os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
Chúng tôi thấy rằng trong sys.modules
chúng tôi đã tìm thấy giống như chúng tôi đã làm trước đây bằng cách sử dụngimport name
OK, chúng ta hãy kiểm tra xem nó trông như thế nào trong locals()
và các globals()
không gian tên:
>>> globals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> locals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['os']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os'
>>>
Bạn có thể truy cập bằng cách sử dụng tên path
không phải bởi os.path
:
>>> path
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
Hãy xóa 'đường dẫn' khỏi locals()
:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Một ví dụ cuối cùng sử dụng bí danh:
>>> from os import path as HELL_BOY
>>> locals()['HELL_BOY']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['HELL_BOY']
<module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
Và không có đường dẫn xác định:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>