แม้ว่าผู้คนจำนวนมากได้อธิบายเกี่ยวกับimportvs import fromแล้วฉันต้องการพยายามอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้นภายใต้ประทุนและสถานที่ที่มันเปลี่ยนไปทั้งหมด
import foo:
นำเข้าfooและสร้างการอ้างอิงถึงโมดูลนั้นในเนมสเปซปัจจุบัน จากนั้นคุณต้องกำหนดพา ธ โมดูลที่สมบูรณ์เพื่อเข้าถึงแอททริบิวหรือวิธีการเฉพาะจากภายในโมดูล
เช่นfoo.barแต่ไม่bar
from foo import bar:
นำเข้าfooและสร้างการอ้างอิงถึงสมาชิกทั้งหมดในรายการ ( bar) fooไม่ได้ตั้งค่าตัวแปร
เช่นbarแต่ไม่ใช่bazหรือfoo.baz
from foo import *:
นำเข้าfooและสร้างการอ้างอิงไปยังวัตถุสาธารณะทั้งหมดที่กำหนดโดยโมดูลนั้นในเนมสเปซปัจจุบัน (ทุกสิ่งที่แสดงใน__all__ถ้า__all__มีอยู่มิฉะนั้นทุกอย่างที่ไม่ได้ขึ้นต้นด้วย_) fooไม่ได้ตั้งค่าตัวแปร
เช่นbarและbazแต่ไม่หรือ_quxfoo._qux
ตอนนี้เรามาดูกันเมื่อเราimport X.Y:
>>> import sys
>>> import os.path
ตรวจสอบsys.modulesกับชื่อosและ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'>
ตรวจสอบglobals()และกำหนดlocals()เนมสเปซด้วยosและ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'
>>>
จากตัวอย่างข้างต้นเราพบว่าosมีการแทรกเฉพาะใน namespace ท้องถิ่นและทั่วโลก ดังนั้นเราควรจะสามารถใช้:
>>> 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'>
>>>
pathแต่ไม่ได้
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
เมื่อคุณลบosเนมสเปซจาก locals () แล้วคุณจะไม่สามารถเข้าถึงได้osรวมos.pathถึงแม้ว่าจะมีอยู่ใน 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
>>>
ตอนนี้เรามาพูดถึงimport from:
from:
>>> import sys
>>> from os import path
ตรวจสอบsys.modulesกับosและ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'>
เราพบว่าในsys.modulesเราพบเช่นเดียวกับที่เราเคยทำมาก่อนโดยใช้import name
ตกลงให้ตรวจสอบว่ามีลักษณะอย่างไรในlocals()และกำหนดglobals()เนมสเปซ:
>>> 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'
>>>
คุณสามารถเข้าถึงโดยใช้ชื่อpathไม่ใช่โดย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
>>>
ลองลบ 'path' จากlocals():
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
ตัวอย่างสุดท้ายโดยใช้นามแฝง:
>>> 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'>
>>>
และไม่มีการกำหนดเส้นทาง:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>