Mimo że wiele osób już wyjaśniało import
vs import from
, chcę spróbować wyjaśnić nieco więcej, co dzieje się pod maską i gdzie są wszystkie miejsca, w których się zmienia.
import foo
:
Import foo
i tworzy odwołanie do tego modułu w bieżącej przestrzeni nazw. Następnie musisz zdefiniować ukończoną ścieżkę modułu, aby uzyskać dostęp do określonego atrybutu lub metody z wnętrza modułu.
Np. foo.bar
Ale niebar
from foo import bar
:
Importuje foo
i tworzy odniesienia do wszystkich wymienionych członków ( bar
). Nie ustawia zmiennejfoo
.
Np. bar
Ale nie baz
lubfoo.baz
from foo import *
:
Importuje foo
i tworzy odwołania do wszystkich obiektów publicznych zdefiniowanych przez ten moduł w bieżącej przestrzeni nazw (wszystko wymienione w, __all__
jeśli __all__
istnieje, w przeciwnym razie wszystko, co nie zaczyna się _
). Nie ustawia zmiennejfoo
.
Np bar
a baz
jednak nie _qux
lub foo._qux
.
Zobaczmy, kiedy to zrobimy import X.Y
:
>>> import sys
>>> import os.path
Sprawdź sys.modules
z nazwą os
i 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'>
Sprawdź globals()
i locals()
przestrzeni nazw dicts z os
i 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'
>>>
Z powyższego przykładu wynika, że tylko os
lokalna i globalna przestrzeń nazw jest wstawiana. Powinniśmy więc móc użyć:
>>> 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'>
>>>
Ale nie path
.
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Raz na usunięciu os
z nazw miejscowych (), nie będzie w stanie uzyskać dostęp os
, a także os.path
, mimo że występują w 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
>>>
Porozmawiajmy teraz o import from
:
from
:
>>> import sys
>>> from os import path
Sprawdź za sys.modules
pomocą os
i 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'>
Zauważyliśmy, sys.modules
że znaleźliśmy to samo, co poprzednio, używającimport name
OK, sprawdźmy, jak to wygląda w, locals()
a globals()
przestrzeń nazw dyktuje:
>>> 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'
>>>
Możesz uzyskać dostęp, używając nazwy, a path
nie 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
>>>
Usuńmy „ścieżkę” z locals()
:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Ostatni przykład użycia aliasu:
>>> 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'>
>>>
I nie zdefiniowano ścieżki:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>