Pythonでは、import *
は正確に何をインポートしますか?含まれているフォルダーにある__init__.py
をインポートしますか?
たとえば、from project.model import __init__
を宣言する必要があるか、またはfrom project.model import *
で十分ですか?
from xyz import *
の "利点"は、他の形式のインポートとは異なり、指定されたモジュールからeverything(まあ、ほとんど... [(a)を参照)すべて)をインポートすることです。現在のモジュール。これにより、インポートされたモジュールのさまざまなオブジェクト(変数、クラス、メソッド...)を、モジュールの名前を前に付けずに使用できます。例えば
>>> from math import *
>>>pi
3.141592653589793
>>>sin(pi/2)
>>>1.0
ただし、(現在のネームスペースに*をインポートする)この方法は推奨されません
したがって、通常、このインポートのプラクティスはアドホックテストなどに限定されます。 @Denilson-Sá-Maiaが指摘したように、(pygameなど)などの一部のライブラリには、最も一般的に使用されるすべての定数と関数が定義されたサブモジュールがあり、そのようなサブモジュールは効果的にdesignedimport *
でインポートされます。これらの特別なサブモジュールを除いて、それ以外の場合は...の方が望ましいです:
少数のオブジェクトのみを明示的にインポートする
>>>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
はサブモジュールもインポートしません(しかし、もちろん、"everything"の省略形である*
は、人々を誤解させる可能性がありますすべてのサブモジュールと他のすべてがインポートされることになります)。
モジュール(またはパッケージ)の__all__
属性にリストされている名前はすべて(現在のネームスペースに)インポートします。このような属性、_
で始まらないすべての名前が欠落しています。
他の回答が示唆するように、プログラムで使用しないでください。
GoogleのPythonスタイルガイド によると、これまでにのみインポートすることをお勧めしますモジュール、notモジュール内からのクラスまたは関数(または他の名前):これを厳密に守ることで、明確さと正確さを実現し、「モジュール内から」のものをインポートするときに生じる可能性のある微妙なトラップを回避します。
パッケージ(またはその中からのもの)をインポートすると、パッケージの__init__.py
が本質的に読み込まれて実行されます。このファイルはパッケージの本体を定義します。ただし、現在のネームスペースの名前__init__
はバインドしません(そのため、この意味ではその名前はインポートされません)。
はい、そうです。 everything(つまり、プライベート変数ではありません。つまり、名前が_
または__
で始まる変数)をインポートします。ローカル名前空間の汚染を避けるため、「 Pythonでモジュールを正しくインポートする 」に従って使用しないようにしてください。
それで十分ですが、一般的には、「 nderstanding python imports 」に従って、すでにimport project.model
をインポートする__init__.py
を実行する必要がありますが、使いすぎると言葉が長すぎるか、後で使用するときにいくつかのキーストロークを保存するにはimport project.model as pm
またはimport project.model as model
になります。
「 「インポート*」インポートとは正確には何ですか? 」のアレックスのアドバイスに従ってください。
project.model
がパッケージの場合、import project.model
によって参照されるモジュールは.../project/model/__init__.py
からのものです。 from project.model import *
は、__init__.py
のネームスペースからすべてをネームスペースにダンプします。モデル内の他のモジュールでは自動的に何もしません。推奨されるスタイルは、__init__.py
が何も含まないことです。
import *
を使用したことはありません。コードが判読不能になり、保守不能になります。
モジュールからどの星/アスタリスク(*)がインポートされたかを確認する良い方法は次のとおりです。
before = dir()
from math import *
after = dir()
print(set(after) - set(before))
戻り値:
{'modf', 'pow', 'erfc', 'copysign', 'sqrt', 'atan2', 'e', 'tanh', 'pi', 'factorial', 'cosh', 'expm1', 'cos', 'fmod', 'frexp', 'log', 'acosh', 'sinh', 'floor', 'isclose', 'lgamma', 'ceil', 'gcd', 'ldexp', 'hypot', 'radians', 'atan', 'isnan', 'atanh', 'before', 'isinf', 'fabs', 'isfinite', 'log10', 'nan', 'tau', 'acos', 'gamma', 'asin', 'log2', 'tan', 'degrees', 'asinh', 'erf', 'fsum', 'inf', 'exp', 'sin', 'trunc', 'log1p'}
私は自分のモジュールで作業していましたが、すべてを明示的にインポートしましたが、インポートするもののリストが長すぎました。そのため、このメソッドを使用して*がインポートしたもののリストを取得する必要がありました。
問題のモジュール(あなたの場合はproject.model
)が__all__
という名前のスティングのリストを定義している場合、そのリスト内のすべての名前付き変数がインポートされます。そのような変数がない場合は、すべてをインポートします。