web-dev-qa-db-fra.com

depuis ... import OR import ... comme pour les modules

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?

41
embert

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
36
Martijn Pieters

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'>
11
A.Zaben

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
11
Depado

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.

7
cdarke