De nombreuses personnes ont déjà expliqué import
vs from
Je vais donc essayer d'expliquer un peu plus ce qui se passe sous le capot, là où se trouve la véritable différence.
Tout d'abord, laissez-moi vous expliquer exactement ce que font les déclarations d'importation de base.
import X
Importe le module X
et crée une référence à ce module dans le espace de nom actuel. Vous devez ensuite définir un chemin d'accès complet au module pour accéder à un attribut ou à une méthode particulière depuis l'intérieur du module (par ex : X.name
o X.attribute
)
from X import *
Importe le module X
et crée des références à tous les objets publics définis par ce module dans l'espace de noms actuel (c'est-à-dire tout ce qui qui n'a pas un nom commençant par _
) ou tout autre nom que vous avez mentionné.
Ou, en d'autres termes, après avoir exécuté cette déclaration, vous pouvez simplement utiliser un nom simple (non qualifié) pour faire référence aux choses définies dans le module X
. Mais X
lui-même n'est pas défini, donc X.name
ne fonctionne pas. Et si name
était déjà défini, il est remplacé par la nouvelle version. Et si le nom dans X
est changé pour pointer vers un autre objet, votre module ne le remarquera pas.
Cela rend tous les noms du module disponibles dans l'espace de nom local.
Maintenant, voyons ce qui se passe quand on fait import X.Y
:
>>> import sys
>>> import os.path
Vérifiez sys.modules
avec le nom os
y 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'>
Vérifiez globals()
y locals()
espace de nom dict avec nom os
y 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 de l'exemple ci-dessus, nous avons constaté que seulement os
est ajouté aux espaces de noms local et global. Ainsi, nous devrions être en mesure d'utiliser os
:
>>> 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'>
>>>
mais pas path
:
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Une fois que vous avez supprimé le os
de locals()
vous ne pourrez pas accéder à l'un ou l'autre des espaces de noms suivants os
o os.path
même s'ils existent dans 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
>>>
Voyons maintenant from
.
from
>>> import sys
>>> from os import path
Vérifiez sys.modules
avec le nom os
y 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'>
Alors sys.modules
ressemble à ce qu'il était lorsque nous avons importé en utilisant import name
.
Ok. Vérifions ce qu'est le locals()
y globals()
Les dicts d'espace de noms ressemblent :
>>> 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'
>>>
Vous pouvez y accéder en utilisant path
mais pas par 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
>>>
Supprimons 'path' de locals() :
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Un dernier exemple utilisant l'aliasing :
>>> 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'>
>>>
Et aucun chemin défini :
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>
Un des pièges de l'utilisation de from
Lorsque vous importez le même name
à partir de deux modules différents :
>>> import sys
>>> from os import stat
>>> locals()['stat']
<built-in function stat>
>>>
>>> stat
<built-in function stat>
Importer les statistiques de shutil
encore :
>>>
>>> from shutil import stat
>>> locals()['stat']
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>> stat
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>>
LE DERNIER IMPORTATEUR GAGNERA
1 votes
Je ne suis pas un expert en matière d'importation, donc je ne laisserai pas de réponse, mais il y a une différence dans la façon dont les choses entrent dans le système.
sys.modules
: jetez un coup d'œil à ceci réponse (à la fin). (Peut-être y a-t-il quelqu'un qui peut l'expliquer mieux que moi)