Python名前空間とは何ですか(そしてなぜ必要なのですか?)
名前の競合は、実際の生活の中ですべての時間が発生します。 たとえば、私が今までに行ったすべての学校には、同じ名前を共有している私のクラスに少なくとも二人の学生がいました。 誰かがクラスに入ってきて、学生Xを求めた場合、私たちは熱心に”あなたはどちらについて話していますか? “その後、尋ねた人は私たちに姓を与え、私たちは彼を右のXに紹介します。
この混乱と、誰もが一意の名前を持っていれば、名以外の情報を探すことによって話している正確な人物を決定するプロセスは避けられます。
これは30人の学生のクラスでは問題ではありません。 しかし、学校、町、都市、国、または全世界のすべての子供のために、ユニークで意味のある覚えやすい名前を考え出すことはますます困難になります。 すべての子供に一意の名前を提供する際のもう一つの問題は、他の誰かが自分の子供にもMacey、Maci、またはMacieという名前を付けたかどうかを判断するプロセ
プログラミングでも非常によく似た競合が発生する可能性があります。 外部依存関係のないわずか30行のプログラムを書いているときは、すべての変数に一意で意味のある名前を付けるのは非常に簡単です。 この問題は、プログラムに何千もの行があり、いくつかの外部モジュールもロードした場合に発生します。 このチュートリアルでは、Pythonでの名前空間、その重要性、およびスコープ解決について学びます。
- 名前空間とは何ですか?名前空間は基本的に、プログラム内のすべての名前が一意であり、競合することなく使用できることを確認するシステムです。 あなたはすでにPythonのような文字列、リスト、関数などのすべてを知っているかもしれません。-オブジェクトです。 もう一つの興味深い事実は、Pythonが名前空間を辞書として実装していることです。 名前をキーとして、オブジェクトを値として持つ、名前からオブジェクトへのマッピングがあります。 複数の名前空間で同じ名前を使用して、それを別のオブジェクトにマップできます。 以下に名前空間の例をいくつか示します。 ローカル名前空間: この名前空間には、関数内のローカル名が含まれます。 この名前空間は、関数が呼び出されたときに作成され、関数が戻るまでのみ持続します。 グローバル名前空間:この名前空間には、プロジェクトで使用しているさまざまなインポートされたモジュールの名前が含まれます。 これは、モジュールがプロジェクトに含まれるときに作成され、スクリプトが終了するまで続きます。 組み込み名前空間:この名前空間には、組み込み関数と組み込み例外名が含まれます。
- スコープとは何ですか?
- Scope Resolution
- モジュールの適切なインポート
- 最終的な考え
- Pythonを学ぶ
名前空間とは何ですか?名前空間は基本的に、プログラム内のすべての名前が一意であり、競合することなく使用できることを確認するシステムです。 あなたはすでにPythonのような文字列、リスト、関数などのすべてを知っているかもしれません。-オブジェクトです。 もう一つの興味深い事実は、Pythonが名前空間を辞書として実装していることです。 名前をキーとして、オブジェクトを値として持つ、名前からオブジェクトへのマッピングがあります。 複数の名前空間で同じ名前を使用して、それを別のオブジェクトにマップできます。 以下に名前空間の例をいくつか示します。
- ローカル名前空間: この名前空間には、関数内のローカル名が含まれます。 この名前空間は、関数が呼び出されたときに作成され、関数が戻るまでのみ持続します。
- グローバル名前空間:この名前空間には、プロジェクトで使用しているさまざまなインポートされたモジュールの名前が含まれます。 これは、モジュールがプロジェクトに含まれるときに作成され、スクリプトが終了するまで続きます。
- 組み込み名前空間:この名前空間には、組み込み関数と組み込み例外名が含まれます。
Envato Tuts+のPythonシリーズの数学モジュールでは、さまざまなモジュールで利用可能な便利な数学関数について書いています。 たとえば、mathモジュールとcmathモジュールには、log10()
acos()
cos()
exp()
math.log10()
cmath.log10()
のように、モジュールの名前の前に接頭辞を付けることです。
スコープとは何ですか?
名前空間は、プログラム内のすべての名前を一意に識別するのに役立ちます。 ただし、これは、任意の場所で変数名を使用できることを意味するものではありません。 名前には、接頭辞を使用せずにその名前を使用できるプログラムの部分を定義するスコープもあります。 名前空間と同じように、プログラムには複数のスコープもあります。 ここでは、プログラムの実行中に存在する可能性のあるスコープのリストを示します。
- 現在の関数で使用可能なローカル名のリストを含む最も内側のスコープであるローカルスコープ。
- 囲むすべての関数のスコープ。 名前の検索は、最も近い囲むスコープから開始され、外側に移動します。
- 現在のモジュールのすべてのグローバル名を含むモジュールレベルのスコープ。
- すべての組み込み名のリストを含む最も外側のスコープ。 このスコープは、参照した名前を検索するために最後に検索されます。
このチュートリアルの今後のセクションでは、組み込みのPython dir()関数を使用して、現在のローカルスコープ内の名前のリストを返します。 これは、名前空間とスコープの概念をより明確に理解するのに役立ちます。
Scope Resolution
前のセクションで述べたように、指定された名前の検索は、最も内側の関数から開始され、プログラムがその名前をオブジェクトにマッ いずれの名前空間にもそのような名前が見つからない場合、プログラムはNameError例外を発生させます。始める前に、IDLEまたは他のPython IDEでdir()
dir()
関数の出力を見てみましょう。
a_num = 10dir()# def some_func(): b_num = 11 print(dir()) some_func()# dir()#
dir()
some_func()
b_num
some_func()
を呼び出すと、グローバル名前空間で使用可能な名前のリストに追加されます。
さて、いくつかの入れ子関数内の名前のリストを見てみましょう。 このブロック内のコードは、前のブロックから続きます。上記のコードは、outer_func()
inner_func()
dir()
d_num
d_num
がそこに定義されている唯一の変数であるため、公正なようです。
global
を使用して明示的に指定されていない限り、ローカル名前空間内でグローバル名を再割り当てすると、同じ名前の新しいローカル変数が作 これは次のコードから明らかです。
outer_func()
inner_func()
a_num
a_num
b_num
print()
関数はこのローカルスコープの変数の値を出力します。
モジュールの適切なインポート
開発をスピードアップするために、プロジェクト内の外部モジュールをインポートするのは非常に一般的です。 モジュールをインポートするには、3つの方法があります。 このセクションでは、これらすべての方法について学び、その長所と短所を詳細に説明します。
from module import *
from module import *
- : モジュールをインポートするこのメソッドは、指定されたモジュールから現在の名前空間に直接すべての名前をインポートします。 モジュールの名前を接頭辞として追加せずに関数を直接使用できるため、このメソッドを使用するように誘惑されるかもしれません。 しかし、それは非常にエラーが発生しやすく、実際にその関数をインポートしたモジュールを伝える機能も失います。 このメソッドの使用例を次に示します:mathモジュールとcmathモジュールに精通している場合は、これらのモジュールの両方で定義されているが、それぞれ実数と複素数に適用される共通の名前がいくつかあることをすでに知っています。
mathモジュールの後にcmathモジュールをインポートしたので、mathモジュールからこれらの一般的な関数の関数定義を上書きします。 このため、最初の
log10(125)
log10(125)
は複素数を返します。 Mathモジュールのlog10()
math.log10(125)
、NameError例外が発生しますmath
実際には名前空間に存在しません。要点は、いくつかのキーストロークを保存するためだけに、異なるモジュールから関数をインポートするこの方法を使用すべきではないということです。
from module import nameA, nameB
module.nameZ
を使用しても、モジュールから他の名前を使用することはできません。 プログラム内で同じ名前を持つ関数は、モジュールからインポートされたその関数の定義も上書きします。 これにより、インポートされた関数が使用できなくなります。 このメソッドを使用する例を次に示します。
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
import module
:これはモジュールをインポートする最も安全で推奨される方法です。 唯一の欠点は、プログラムで使用するすべての名前にモジュールの名前の前に接頭辞を付ける必要があることです。 ただし、名前空間の汚染を回避し、名前がモジュールの関数の名前と一致する関数を定義することもできます。
dir()# import mathdir()# math.log10(125)# 2.0969100130080562
最終的な考え
このチュートリアルでは、名前空間とその重要性を理解するのに役立つことを願っています。 これで、プログラム内の異なる名前の範囲を決定し、潜在的な落とし穴を避けることができるはずです。
さらに、私たちは市場での販売のために、研究のために利用可能なものを見ることを躊躇しないで、任意の質問をし、以下のフィードを使用して、あなたの貴重なフィードバックを提供することを躊躇しないでください。
記事の最後のセクションでは、Pythonでモジュールをインポートするさまざまな方法と、それぞれの長所と短所について説明しました。 このトピックに関連する質問がある場合は、コメントでお知らせください。
Pythonを学ぶ
あなただけの始めているか、新しいスキルを学ぶために探してベテランコーダーだかどうか、私たちの完全なpythonチュートリアルガイ
- : モジュールをインポートするこのメソッドは、指定されたモジュールから現在の名前空間に直接すべての名前をインポートします。 モジュールの名前を接頭辞として追加せずに関数を直接使用できるため、このメソッドを使用するように誘惑されるかもしれません。 しかし、それは非常にエラーが発生しやすく、実際にその関数をインポートしたモジュールを伝える機能も失います。 このメソッドの使用例を次に示します:mathモジュールとcmathモジュールに精通している場合は、これらのモジュールの両方で定義されているが、それぞれ実数と複素数に適用される共通の名前がいくつかあることをすでに知っています。