Mimo że wiele osób już wyjaśniało importvs 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.barAle niebar
from foo import bar:
Importuje fooi tworzy odniesienia do wszystkich wymienionych członków ( bar). Nie ustawia zmiennejfoo .
Np. barAle nie bazlubfoo.baz
from foo import *:
Importuje fooi 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 bara bazjednak nie _quxlub foo._qux.
Zobaczmy, kiedy to zrobimy import X.Y:
>>> import sys
>>> import os.path
Sprawdź sys.modulesz nazwą osi 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 osi 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 oslokalna 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 osz 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.modulespomocą osi 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 pathnie 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'
>>>