私はPython&Pythonの概念"namespaces"の概念に出会ったばかりです。私はそれが何であるかを理解しましたが、重力に感謝することはできません。この概念の。
ネットを閲覧していると、PHPに反対する理由の1つは、名前空間をネイティブでサポートしていないことです。
名前空間の使用方法とこの機能によってプログラミングがどのように改善されるかについて誰かが説明できますか(Pythonではなく、名前空間は特定の言語に限定された概念ではないと想定しているため)。
私は主にJavaおよびCプログラミングのバックグラウンドから来ています。
名前空間は、スコープを実装する方法です。
Java(またはC))では、コンパイラは静的スコープ分析を通じて変数が表示される場所を決定します。
Cでは、スコープは関数の本体、グローバル、または外部のいずれかです。コンパイラーはこれをユーザーに代わって推論し、スコープルールに基づいて各変数名を解決します。すべてのモジュールがコンパイルされた後、外部名はリンカーによって解決されます。
Javaでは、スコープはメソッド関数の本体、またはクラスのすべてのメソッドです。一部のクラス名には、モジュールレベルのスコープもあります。この場合も、コンパイラはコンパイル時にこれを計算し、スコープルールに基づいて各名前を解決します。
Pythonでは、各パッケージ、モジュール、クラス、関数、およびメソッド関数は、変数名が解決される「名前空間」を所有しています。さらに、名前がローカル名前空間にない場合に使用されるグローバル名前空間があります。
各変数名は、ローカル名前空間(関数の本体、モジュールなど)でチェックされ、次にグローバル名前空間でチェックされます。
変数は通常、ローカル名前空間でのみ作成されます。 global
およびnonlocal
ステートメントは、ローカル名前空間以外の変数を作成できます。
関数、メソッド関数、モジュール、またはパッケージが評価されると(つまり、実行が開始されると)、名前空間が作成されます。それを「評価コンテキスト」と考えてください。関数やメソッド関数などの実行が完了すると、名前空間は削除されます。変数は削除されます。オブジェクトも削除される可能性があります。
名前空間は、別の人が書いた可能性のある同じ名前のクラス、メソッド、オブジェクト間の競合を防ぎます。
Javaバックグラウンドから来る場合、パッケージを使用してこれを実現する方法におそらく慣れているでしょう。たとえば、movieyoda.DateUtils
クラスと私はmikej.DateUtils
クラスとパッケージを使用すると、クラスを使用するコードでクラスを区別できます。 (Pythonには 非常によく似たもの があります。)
名前空間はPHP 5.3.0で追加されましたが、以前のバージョン(および名前空間を提供しない他の言語)では、リスクを軽減するためにクラスとメソッド名の前に何かを付ける必要があります名前の衝突の例:movieyoda_parse_file
関数。
名前空間を理解するには、Pythonのモジュールについてもある程度理解している必要があります。モジュールは、Pythonコードを含む単純なファイルです。このコードは、Pythonクラス、関数、または単に名前のリストの形式にすることができます。各モジュール独自のグローバル名前空間を取得します。したがって、モジュールの名前空間を共有するため、同じモジュール内に同じ名前で2つのクラスまたは2つの関数を含めることはできません。
S.Lottの答えを完成させます。
スコープは名前の管理だけではないので、名前空間はスコープ内で名前の管理を実装する方法だと思います。
Cでは、スコープは4つのタイプ(グローバル、関数、ブロック、および関数パラメーター(プロトタイプ))です。これらの種類はそれぞれ、必要に応じて1つ以上の名前空間を作成できます。 Cには4つのnsがあります-s/u/eのタグ-型名、関数名、変数名のID-関数プロトタイプ内のパラメーター-s/u内のメンバーとビットフィールド。
そのように、タグ識別子と関数名は衝突しませんが、typedefによって定義されたタイプ名は変数名と衝突する可能性があります。
pythonには、グローバルnsを囲む組み込みの名前空間があり、グローバルnsはロードされたモジュールによって提供されます。組み込みのnsには変数が含まれています。変数のシンボルは、オブジェクトまたは関数-たとえば、+
がそこで定義されています。モジュールのグローバルnsは、終了するまで続きます。