Dois-je utiliser
from foo import bar
OR
import foo.bar as bar
quand importation d'un module et et il y a pas besoin/souhait de changer le nom (bar
)?
Y a-t-il des différences? Est-ce que ça importe?
En supposant que bar
est un module ou un package dans foo
, il n'y a pas de différence, cela n'a pas d'importance. Les deux déclarations ont exactement le même résultat:
>>> import os.path as path
>>> path
<module 'posixpath' from '/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/posixpath.pyc'>
>>> from os import path
>>> path
<module 'posixpath' from '/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/posixpath.pyc'>
Si bar
n'est pas un module ou un package, le second formulaire ne fonctionnera pas; un traceback est jeté à la place:
>>> import os.walk as walk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named walk
Vous pouvez utiliser as pour renommer les modules en supposant que vous avez deux applications qui ont des vues et que vous souhaitez les importer
from app1 import views as views1
from app2 import views as views2
si vous voulez une importation multiple, utilisez la séparation par virgule
>>> from datetime import date as d, time as t
>>> d
<type 'datetime.date'>
>>> t
<type 'datetime.time'>
La seule chose que je peux voir pour la deuxième option est que vous aurez besoin d'autant de lignes que vous voulez importer. Par exemple :
import foo.bar as bar
import foo.tar as tar
import foo.zar as zar
Au lieu de simplement faire:
from foo import bar, tar, zar
Ceci est une réponse tardive, résultant de quelle est la différence entre 'import a.b as b' et 'from a import b' in python
Cette question a été signalée comme un doublon, mais il existe une différence importante entre les deux mécanismes qui n'a pas été abordée par d'autres.
from foo import bar
importe tout objet appelé bar
de l'espace de noms foo
dans l'espace de noms actuel.
import foo.bar as bar
importe un objet importable (package/module/espace de noms) appelé foo.bar
et lui donne l'alias bar
.
Quelle est la différence?
Prenez un répertoire (package) appelé foo
qui a un __init__.py
contenant:
# foo.__init__.py
class myclass:
def __init__(self, var):
self.__var = var
def __str__(self):
return str(self.__var)
bar = myclass(42)
Pendant ce temps, il y a aussi un module dans foo
appelé bar.py
.
from foo import bar
print(bar)
Donne:
42
Tandis que:
import foo.bar as bar
print(bar)
Donne:
<module 'foo.bar' from '/Users//..../foo/bar.py'>
On voit donc que import foo.bar as bar
est plus sûr.