Mesmo que muitas pessoas já tenham explicado sobre o import
vs import from
, quero tentar explicar um pouco mais sobre o que acontece sob o capô e onde estão todos os lugares em que ele muda.
import foo
:
Importa foo
e cria uma referência a esse módulo no espaço para nome atual. Em seguida, você precisa definir o caminho completo do módulo para acessar um atributo ou método específico de dentro do módulo.
Por exemplo, foo.bar
mas nãobar
from foo import bar
:
Importa foo
e cria referências a todos os membros listados ( bar
). Não define a variável foo
.
Por exemplo, bar
mas não baz
oufoo.baz
from foo import *
:
Importa foo
e cria referências a todos os objetos públicos definidos por esse módulo no espaço para nome atual (tudo listado __all__
se __all__
existir, caso contrário, tudo o que não começa _
). Não define a variável foo
.
Por exemplo, bar
e baz
mas não _qux
ou foo._qux
.
Agora vamos ver quando fazemos import X.Y
:
>>> import sys
>>> import os.path
Verifique sys.modules
com nome os
e 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'>
Os dicionários de verificação globals()
e locals()
namespace com os
e 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'
>>>
A partir do exemplo acima, descobrimos que apenas os
é inserido no espaço para nome local e global. Portanto, devemos poder usar:
>>> 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'>
>>>
Mas não path
.
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Depois de excluir o os
espaço de nomes from locals (), você não poderá acessar os
, os.path
mesmo que eles existam em 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
>>>
Agora vamos falar sobre import from
:
from
:
>>> import sys
>>> from os import path
Verifique sys.modules
com os
e 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'>
Descobrimos que em sys.modules
que encontramos o mesmo que antes, usandoimport name
OK, cheque de deixar como ele se parece em locals()
e 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'
>>>
Você pode acessar usando o nome path
não por 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
>>>
Vamos excluir 'path' de locals()
:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Um exemplo final usando um 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'>
>>>
E nenhum caminho definido:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>