import *およびimport *からのPython、それらの機能はパッケージを使用に導入することですが、それらはどのように実行され、なぜこの構文を使用するのですか?
1つのモジュールからすべての機能をインポートします
from import *は、「アクセス許可のあるすべての名前にアクセスできるようにしたい」という意味です。たとえば、次のコードはsomething.pyです。
# something.py
public_variable =42
_ private_variable =141
def public_function():print("I'm a public function! yay!")
def _private_function():print("Ain't nobody accessing me from another module...usually")classPublicClass(object):
pass
class_WeirdClass(object):
pass
Pythonインタープリターでは、import *から実行すると、次のように表示されます。
from something import*
public_variable
42
_ private_variable
...
NameError: name '_private_variable' is not defined
public_function()"I'm a public function! yay!"_private_function()...
NameError: name '_private_function' is not defined
c =PublicClass()
c
< something.publicclass object="" at=""...=""
c =_WeirdClass()...
NameError: name '_WeirdClass' is not defined
from something import * _で始まる名前を除くすべての名前を何かからインポートしました。仕様によると、_で始まる名前はプライベートであり、インポートされていません。
__all__が上で言及されていないもの。 __all__は、from import *が使用されたときに、モジュール(または後述するパッケージ)内のどのシンボルがエクスポートされるかを指定する文字列のリストです。 __all__を定義しない場合(上記でsomething.pyを定義しなかった場合)、import *のデフォルトのインポート方法は、下線(_)を除くすべての名前をインポートすることです。繰り返しになりますが、下線が引かれたプログラミング規則は、シンボルがプライベートであり、インポートしないことが合理的であることを示しています。独自の__all__をsomething.pyで定義するとどうなるか見てみましょう。
# something.py
__ all__ =['_private_variable','PublicClass']
# The rest is the same as before
public_variable =42
_ private_variable =141
def public_function():print("I'm a public function! yay!")
def _private_function():print("Ain't nobody accessing me from another module...usually")classPublicClass(object):
pass
class_WeirdClass(object):
pass
ここで、import *は、_private_variableとPublicClassのみをインポートすることを期待しています。
# something.py
__ all__ =['_private_variable','PublicClass']
# The rest is the same as before
public_variable =42
_ private_variable =141
def public_function():print("I'm a public function! yay!")
def _private_function():print("Ain't nobody accessing me from another module...usually")classPublicClass(object):
pass
class_WeirdClass(object):
pass
バッグは何ですか?
パッケージからすべてをインポートする場合、__ all__は基本的にモジュールと同じですが、(モジュール内のすべての名前をインポートするのではなく)パッケージ内のモジュールを処理します。したがって、from import *を使用する場合、__ all__は、現在の名前名にインポートする必要があるすべてのモジュールを意味します。
違いは、パッケージの__init__。pyで__all__を宣言しない場合、from import *ステートメントは何もインポートしないことです(このステートメントは完全には正しくありません。これが正しいステートメントです)。
しかし、これの何が問題になっていますか?
続行する前に、Pythonインタープリターでこれをインポートして実行し、PythonのZenをもう一度読んでください(就寝前に毎晩子供に読んでください)。
曖昧であるよりも明確である方が良いです。
インポートから*はあいまいです。何をインポートしているのか、現在の名前名に何を持ち込んでいるのかはわかりません。より良いアプローチは、必要なすべての名前を明示的にインポートすることです。このようにして、読者(将来的にはおそらくあなた自身)は、コードで使用される変数/メソッド/クラス/その他のものがどこから来ているのかについて混乱することはありません。これは次のポイントも教えてくれます。
読みやすさが重要です
多くのものをインポートする必要がある場合でも、明示的に1つずつインポートする方が明確です。 PEP328を使用します。
from Tkinter import(Tk, Frame, Button, Entry, Canvas, Text,
LEFT, DISABLED, NORMAL, RIDGE, END)
これで、名前空間の内容を明確に知ることができ、ctrl + fを使用すると、それらがどこから来たのかをすばやく知ることができます。
同時に、モジュール/パッケージの作成者がリストの内容を変更する(追加/削除する)リスクを常に負う必要があります。
コンテンツの拡張:
基本的な注意
上記は、Pythonでのパッケージの導入の詳細を理解する方法です。Pythonでのパッケージの導入の詳細については、ZaLou.Cnの他の関連記事に注意してください。
Recommended Posts