web-dev-qa-db-ja.com

from ... import OR import ...モジュールの場合

使用すべきですか

from foo import bar

OR

import foo.bar as bar

モジュールのインポートで、かつ名前を変更する必要がない/希望しないbar)?

違いはありますか?それは重要ですか?

41
embert

barfooのモジュールまたはパッケージであると仮定すると、違いはありません、それは重要ではありません。 2つのステートメントの結果はまったく同じです。

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

barがモジュールまたはパッケージでない場合、2番目の形式は機能しません。代わりにトレースバックがスローされます。

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

asを使用してモジュールの名前を変更できます。ビューを持つ2つのアプリがあり、それらをインポートする場合

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

複数のインポートが必要な場合は、カンマ区切りを使用します

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

2番目のオプションについて確認できる唯一のことは、インポートするものと同じ数の行が必要になることです。例えば ​​:

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

単に行う代わりに:

from foo import bar, tar, zar
11
Depado

これは遅い応答であり、 Pythonの 'import a.b as b'と 'from a import b'の違いは何ですか

この質問には重複としてフラグが付けられていますが、2つのメカニズムには重要な違いがあり、他のメカニズムでは対処されていません。

from foo import barは、名前空間barから現在の名前空間にfooと呼ばれるanyオブジェクトをインポートします。

import foo.bar as barは、foo.barというインポート可能なオブジェクト(パッケージ/モジュール/ネームスペース)をインポートし、エイリアスbarを与えます。

違いは何ですか?

以下を含む__init__.pyを持つfooというディレクトリ(パッケージ)を取得します。

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

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

bar = myclass(42)

一方、alsobar.pyと呼ばれるfoo内のモジュールもあります。

from foo import bar
print(bar)

与える:

42

一方、

import  foo.bar as bar
print(bar)

与える:

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

したがって、import foo.bar as barの方が安全であることがわかります。

7
cdarke