Mặc dù nhiều người đã giải thích về importvs 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 foovà 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.barnhưng khôngbar
from foo import bar:
Nhập khẩu foovà 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 barnhưng không bazhayfoo.baz
from foo import *:
Nhập khẩu foovà 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ụ barvà bazkhông _quxhoặ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.modulesvới tên osvà 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 osvà 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 oskhông gian tên từ locals (), bạn sẽ không thể truy cập oscũng như os.pathmặ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.modulesvới osvà 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.moduleschú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 pathkhô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'
>>>