Pythonでは、次の2行のコードの違いがよくわかりません。
import X
または
from X import *
どちらもモジュールXからすべてをインポートするだけではありませんか?違いは何ですか?
import x
の後には、x
の中でx.something
のように参照できます。 from x import *
の後は、x
内のものをsomething
と同じように直接参照できます。 2番目の形式は名前をローカル名前空間に直接インポートするため、多くのモジュールからインポートすると競合が発生する可能性があります。したがって、from x import *
はお勧めしません。
from x import something
を実行することもできます。これにより、something
のすべてではなく、x
のみがローカルネームスペースにインポートされます。インポートする名前を一覧表示すると、インポートする内容が正確にわかるため、名前の競合を回避しやすくなるため、これはより良い方法です。
import X
:すべてをX.var1
、X.var2
などとしてインポートします
from X import *
:これはすべてをvar1
、var2
などとしてインポートします。つまり、ローカル名前空間をフラッディングします
2つの呼び出しの後の違いを確認します。
>>> import math
>>> len(globals())
5 #no of variables in namespace
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '__package__': None}
>>>
>>>
>>> from math import *
>>> len(globals())
47 #no of variables in namespace
>>> globals()
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>}
import X
モジュールオブジェクトを参照するローカル名前空間にラベルを作成します。
from X import *
ローカル名前空間に直接、X
モジュールのすべてのメンバー属性のラベルを作成します。
どちらの操作でもX
がsys.modules
、trueに追加されますが、ローカル名前空間への影響が違います。
違いがあり、単純なものもあれば、さらに説明が必要なものもあります。
import X
は、モジュール全体をインポートし(読み取り:「モジュールを実行する」)、ローカルスコープで名前を割り当てます。名前は次のようにエイリアスできます:import X as Y
from X import *
は、デフォルトで、モジュールX
のすべてのattributesをローカルスコープにインポートします。次に、さまざまな使用例を示します。
# Assume that module `X` contains an `opendb` function
import X
X.opendb('Y')
# VS.
from X import *
opendb('Y')
これがわずかにより複雑になるのは、モジュールが__all__
を定義する場合です。これにより、from X import *
のセマンティクスが「すべてをインポートするリストされている__all__
プロパティ」を意味するように変更されます。これにより、モジュール作成者は、モジュールからエクスポートされる関数とオブジェクトを制御できます。
never何をしているのか本当にわかっているのでない限り、from X import *
を使用してください。別のモジュールまたは独自のプログラムのシンボルと競合するモジュールXのシンボルを取得できます。そのルールの唯一の例外は時々from math import *
です。
from X import y
という形式を使用して、モジュールから単一のものを取得できます。
import X
フォームを使用すると、モジュールの使用法を明示的にX.y
にするだけでなく、モジュールに変更を加えて再インポートする必要がある場合にreload
関数を使用できるようになります。
from X import *
は、モジュールX
からすべての要素を現在のネームスペースにインポートします。 import X
Xをインポートしますが、名前空間を「マージ」しません。例えば。:
モジュールX:
def foo(): pass
BAR = 12
あなたのコード:
from X import *
foo() # calls X.foo
print BAR # prints 12
または:
import X
X.foo()
print X.BAR
これをモジュール定義の例として使用しましょう
def my_func():
return 1
fromインポートはすべてを現在の名前空間に取り込みます
from X import *
print my_func()
通常のインポートでは、現在の名前空間にXというモジュールオブジェクトが作成されます
import X
print x.my_func()
さらに、from Xインポートでは、my_funcを使用してその機能のみをインポートできます。