แม้ว่าผู้คนจำนวนมากได้อธิบายเกี่ยวกับimport
vs 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
แต่ไม่หรือ_qux
foo._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'
>>>