from … import OR import … as for modules

2020-01-30 07:40发布

问题:

Should I use

from foo import bar

OR

import foo.bar as bar

when importing a module and and there is no need/wish for changing the name (bar)?

Are there any differences? Does it matter?

回答1:

Assuming that bar is a module or package in foo, there is no difference, it doesn't matter. The two statements have exactly the same result:

>>> 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'>

If bar is not a module or package, the second form will not work; a traceback is thrown instead:

>>> import os.walk as walk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named walk


回答2:

You can use as to rename modules suppose you have two apps that have views and you want to import them

from app1 import views as views1
from app2 import views as views2

if you want multiple import use comma separation

>>> from datetime import date as d, time as t
>>> d
<type 'datetime.date'>
>>> t
<type 'datetime.time'>


回答3:

This is a late answer, arising from what is the difference between 'import a.b as b' and 'from a import b' in python

This question has been flagged as a duplicate, but there is an important difference between the two mechanisms that has not been addressed by others.

from foo import bar imports any object called bar from namespace foo into the current namespace.

import foo.bar as bar imports an importable object (package/module/namespace) called foo.bar and gives it the alias bar.

What's the difference?

Take a directory (package) called foo which has an __init__.py containing:

# foo.__init__.py
class myclass:
    def __init__(self, var):
        self.__var = var

    def __str__(self):
        return str(self.__var)

bar = myclass(42)

Meanwhile, there is also a module in foo called bar.py.

from foo import bar
print(bar)

Gives:

42

Whereas:

import  foo.bar as bar
print(bar)

Gives:

<module 'foo.bar' from '/Users//..../foo/bar.py'>

So it can be seen that import foo.bar as bar is safer.



回答4:

The only thing I can see for the second option is that you will need as many lines as things you want to import. For example :

import foo.bar as bar
import foo.tar as tar
import foo.zar as zar

Instead of simply doing :

from foo import bar, tar, zar