Meskipun banyak orang sudah menjelaskan tentang import
vs import from
, saya ingin mencoba menjelaskan lebih banyak tentang apa yang terjadi di bawah tenda, dan di mana semua tempat itu berubah berada.
import foo
:
Mengimpor foo
, dan membuat referensi ke modul itu di namespace saat ini. Kemudian Anda perlu mendefinisikan jalur modul yang telah selesai untuk mengakses atribut atau metode tertentu dari dalam modul.
Misalnya foo.bar
tetapi tidakbar
from foo import bar
:
Impor foo
, dan buat referensi ke semua anggota yang terdaftar ( bar
). Tidak mengatur variabel foo
.
Misalnya bar
tetapi tidak baz
ataufoo.baz
from foo import *
:
Mengimpor foo
, dan membuat referensi ke semua objek publik yang ditentukan oleh modul itu di namespace saat ini (semua yang terdaftar __all__
jika __all__
ada, jika tidak semua yang tidak dimulai dengan _
). Tidak mengatur variabel foo
.
Misal bar
dan baz
tapi tidak _qux
atau foo._qux
.
Sekarang mari kita lihat kapan kita melakukannya import X.Y
:
>>> import sys
>>> import os.path
Periksa sys.modules
dengan nama os
dan 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'>
Periksa globals()
dan locals()
dict namespace dengan os
dan 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'
>>>
Dari contoh di atas kami menemukan bahwa hanya os
dimasukkan dalam namespace lokal dan global. Jadi, kita harus dapat menggunakan:
>>> 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'>
>>>
Tapi tidak path
.
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Setelah Anda menghapus os
namespace dari lokal (), Anda tidak akan dapat mengakses os
juga os.path
meskipun mereka ada di 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
>>>
Sekarang mari kita bicara tentang import from
:
from
:
>>> import sys
>>> from os import path
Periksa sys.modules
dengan os
dan 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'>
Kami menemukan bahwa dalam sys.modules
kami menemukan sama seperti yang kami lakukan sebelumnya dengan menggunakanimport name
OK, mari kita periksa seperti apa dict locals()
dan globals()
namespace dicts:
>>> 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'
>>>
Anda dapat mengakses dengan menggunakan nama path
bukan dengan 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
>>>
Mari kita hapus 'path' dari locals()
:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Satu contoh terakhir menggunakan alias:
>>> 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'>
>>>
Dan tidak ada jalur yang ditentukan:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>