Python では、import とは正確には何ですか?含まれているフォルダー内で見つかったimport *
ものをインポートするのですか?__init__.py
たとえば、 を宣言する必要がありますかfrom project.model import __init__
、それともfrom project.model import *
十分ですか?
ベストアンサー1
from xyz import *
他の輸入形態と比較した「利点」は、すべて(まあ、ほとんど... [下記 (a) を参照] すべて)現在のモジュールの指定されたモジュールからインポートします。これにより、インポートされたモジュールのさまざまなオブジェクト(変数、クラス、メソッドなど)を使用できます。モジュール名を先頭に付けずに。 例えば
>>> from math import *
>>>pi
3.141592653589793
>>>sin(pi/2)
>>>1.0
ただし、この方法(現在の名前空間に*をインポートする)は推奨されません。なぜなら
- 名前空間の衝突が発生する可能性がある(インポート前に変数名 pi があった場合など)
- インポートするオブジェクトの数が多い場合は非効率になる可能性があります
- 変数/メソッド/クラスの起源を明示的に文書化していない (将来コードを参照するときにプログラムの「自己文書化」があると便利です)
したがって、通常はこのインポート*の実践をアドホックテストなどに限定します。@Denilson-Sá-Maiaが指摘したように、pygameなどの一部のライブラリには、最もよく使用される定数と関数がすべて定義されているサブモジュールがあり、そのようなサブモジュールは事実上設計でインポートされますimport *
。これらの特別なサブモジュール以外では、... を使用することをお勧めします。
いくつかのオブジェクトのみを明示的にインポートする
>>>from math import pi
>>>pi
>>>3.141592653589793
>>> sin(pi/2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined
またはモジュールを独自の名前空間でインポートする(または、特にこれが長い名前であり、プログラムがそのオブジェクトを何度も参照する場合は、その別名)
>>>import math
>>>math.pi
>>>3.141592653589793
etc..
>>>import math as m #bad example math being so short and standard...
>>>m.pi
>>>3.141592653589793
etc..
を参照してくださいこのトピックに関するPythonドキュメント
(a) 具体的には、何がインポートされますかfrom xyz import *
?
xyz モジュールが__all__
変数を定義する場合、このシーケンスで定義されているすべての名前がインポートされます。それ以外の場合は、アンダースコアで始まる名前を除くすべての名前がインポートされます。
注記多くの図書館にはサブモジュール例えば、標準ライブラリには、、などのurllib
サブモジュールが含まれています。よく混乱する点は、urllib.request
urllib.errors
urllib.response
from urllib import *
これらすべてのサブモジュールをインポートします。それはそうではない: これらを、例えばfrom urllib.request import *
などで明示的にインポートする必要があります。これは に固有のものではなくimport *
、プレーンimport
ではサブモジュールもインポートされません(もちろん、 は*
の省略形であることが多いですが、"すべて"すべてのサブモジュールとその他すべてがインポートされると誤解される可能性があります。