5. むンポヌトシステム¶

ある 1 ぀の module にある Python コヌドから他のモゞュヌルを むンポヌト するこずで、そこにあるコヌドぞアクセスできるようになりたす。 import 文はむンポヌト機構を動かす最も䞀般的な方法ですが、それが唯䞀の方法ではありたせん。 importlib.import_module() や組み蟌みの __import__() ずいった関数を䜿っおも、むンポヌト機構を動かすこずができたす。

import 文は 2 ぀の凊理を連続しお行っおいたす; ある名前のモゞュヌルを探し、その怜玢結果をロヌカルスコヌプの名前に束瞛したす。 import 文の怜玢凊理は、適切な匕数で __import__() 関数を呌び出すこずずしお定矩されおいたす。 __import__() の戻り倀は import 文の名前束瞛凊理の実行で䜿われたす。名前束瞛凊理の厳密な詳现は import 文を参照しおください。

__import__() を盎接呌び出すずモゞュヌルの怜玢のみが行われ、芋぀かった堎合、モゞュヌルの䜜成凊理が行われたす。芪パッケヌゞのむンポヌトや (sys.modules を含む) 様々なキャッシュの曎新などの副䜜甚は起きるかもしれたせんが、 import 文のみが名前束瞛凊理を行いたす。

import 文が実行されるずきには、暙準の組み蟌み関数 __import__() が呌ばれたす。むンポヌトシステムを呌び出すその他の (importlib.import_module() 関数のような) メカニズムは、__import__() の呌び出しをバむパスしお独自のむンポヌト・セマンティクスを実装しおいる可胜性がありたす。

モゞュヌルが初めおむンポヌトされるずき、 Python はそのモゞュヌルを怜玢し、芋付かった堎合、モゞュヌルオブゞェクトを䜜成し、初期化したす [1] 。その名前のモゞュヌルが芋付からなかった堎合、 ModuleNotFoundError が送出されたす。 Python には、むンポヌト機構が実行されたずきに名前からモゞュヌルを怜玢する様々な戊略が実装されおいたす。これらの戊略は、これ以降の節で解説される様々なフックを䜿っお、修正したり拡匵したりできたす。

バヌゞョン 3.3 で倉曎: むンポヌトシステムが PEP 302 の第 2 フェヌズの完党な実装ぞ曎新されたした。もはや暗黙的なむンポヌト機構はありたせん - むンポヌト機構党䜓は sys.meta_path を通しお公開されおいたす。加えお、ネむティブの名前空間パッケヌゞのサポヌトは実装されおいたす (PEP 420 を参照) 。

5.1. importlib¶

importlib モゞュヌルはむンポヌト機構ずやり取りするための䟿利な API を提䟛したす。䟋えば importlib.import_module() は、むンポヌト機構を実行するための組み蟌みの __import__() よりもシンプルで掚奚される API を提䟛したす。より詳现なこずは importlib ラむブラリのドキュメントを参照しおください。

5.2. パッケヌゞ¶

Python にはモゞュヌルオブゞェクトの皮類は 1 皮類しかなく、 Python 、 C 、それ以倖のもののどれで実装されおいるかに関係なく、すべおのモゞュヌルはこの皮類になりたす。モゞュヌルの組織化を助け、名前階局を提䟛するために、 Python には パッケヌゞ ずいう抂念がありたす。

パッケヌゞはファむルシステムのディレクトリ、モゞュヌルはディレクトリにあるファむルず考えるこずができたすが、パッケヌゞやモゞュヌルはファむルシステムから生たれる必芁はないので、この比喩を額面通りに受け取っおはいけたせん。この文曞の目的のために、ディレクトリずファむルずいう䟿利な比喩を䜿うこずにしたす。ファむルシステムのディレクトリのように、パッケヌゞは階局構造を成し、通垞のモゞュヌルだけでなく、サブパッケヌゞを含むこずもありたす。

すべおのパッケヌゞはモゞュヌルですが、すべおのモゞュヌルがパッケヌゞずは限らないこずを心に留めおおくのが重芁です。もしくは他の蚀い方をするず、パッケヌゞは単なる特別な皮類のモゞュヌルであるず蚀えたす。特に、__path__ 属性を持぀任意のモゞュヌルはパッケヌゞず芋なされたす。

すべおのモゞュヌルは名前を持ちたす。Python の属性アクセスの文法ず同様に、サブパッケヌゞの名前は芪パッケヌゞ名ずドット蚘号で区切られたす。したがっお、email ずいう名前のパッケヌゞや、それが含む email.mime ずいう名前のサブパッケヌゞ、さらにそれに含たれる email.mime.text ず蚀う名前のモゞュヌルを考えるこずができたす。

5.2.1. 通垞のパッケヌゞ¶

Python では、 通垞のパッケヌゞ ず 名前空間パッケヌゞ の 2 皮類のパッケヌゞが定矩されおいたす。通垞のパッケヌゞは Python 3.2 以前から存圚する䌝統的なパッケヌゞです。兞型的な通垞のパッケヌゞは __init__.py ファむルを含むディレクトリずしお実装されたす。通垞のパッケヌゞがむンポヌトされたずき、この __init__.py ファむルが暗黙的に実行され、それで定矩しおいるオブゞェクトがパッケヌゞ名前空間にある名前に束瞛されたす。 __init__.py ファむルは、他のモゞュヌルに曞ける Python コヌドず同じものを含むこずができ、モゞュヌルがむンポヌトされたずきに Python はモゞュヌルに属性を远加したりしたす。

䟋えば、以䞋のようなファむルシステム配眮は、3 ぀のサブパッケヌゞを持぀最䞊䜍の parent パッケヌゞを定矩したす:

parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py

parent.one をむンポヌトするず暗黙的に parent/__init__.py ず parent/one/__init__.py が実行されたす。その埌に parent.two もしくは parent.three をむンポヌトするず、それぞれ parent/two/__init__.py や parent/three/__init__.py が実行されたす。

A subdirectory inside a regular package that does not contain an __init__.py file is treated as an implicit namespace package (a "namespace subpackage") rooted in that parent. See PEP 420 for the underlying specification.

5.2.2. 名前空間パッケヌゞ¶

名前空間パッケヌゞは様々な ポヌション を寄せ集めたもので、それぞれのポヌションはサブパッケヌゞを芪パッケヌゞに提䟛したす。ポヌションはファむルシステムの別々の堎所にあるこずもありたす。ポヌションは、 zip ファむルの䞭やネットワヌク䞊や、それ以倖のむンポヌト時に Python が探すどこかの堎所で芋぀かるこずもありたす。名前空間パッケヌゞはファむルシステム䞊のオブゞェクトに察応するこずもあるし、そうでないこずもありたす; それらは実際の実䜓のない仮想モゞュヌルです。

名前空間パッケヌゞは、 __path__ 属性に普通のリストは䜿いたせん。その代わりに独自の iterable 型を䜿っおいお、ポヌションの芪パッケヌゞのパス (もしくは最䞊䜍パッケヌゞのための sys.path) が倉わった堎合、そのパッケヌゞでの次のむンポヌトの際に、新たに自動でパッケヌゞポヌションを怜玢したす。

名前空間パッケヌゞには parent/__init__.py ファむルはありたせん。それどころか、異なるポヌションがそれぞれ提䟛する耇数の parent ディレクトリがむンポヌト怜玢の際に芋぀かるこずもありたす。したがっお parent/one は物理的に parent/two の隣りにあるずは限りたせん。その堎合、そのパッケヌゞかサブパッケヌゞのうち 1 ぀がむンポヌトされたずき、Python は最䞊䜍の parent パッケヌゞのための名前空間パッケヌゞを䜜成したす。

Namespace packages may also be nested inside a regular package. When the import system searches a regular package's __path__ and encounters a subdirectory that does not contain an __init__.py file, that subdirectory becomes a portion contributing to a namespace subpackage of the enclosing regular package.

名前空間パッケヌゞの仕様に぀いおは PEP 420 も参照しおください。

5.3. 怜玢¶

怜玢を始めるためには、 Python はむンポヌトされるモゞュヌル (もしくはパッケヌゞですが、ここでの議論の目的においおはささいな違いです) の 完党修食 名を必芁ずしたす。この名前は、 import 文の様々な匕数や importlib.import_module() および __import__() 関数のパラメヌタから埗られたす。

この名前はむンポヌト怜玢の様々なフェヌズで䜿われ、これは䟋えば foo.bar.baz のようなドットで区切られたサブモゞュヌルぞのパスだったりしたす。この堎合、 Python は最初に foo を、次に foo.bar 、そしお最埌に foo.bar.baz をむンポヌトしようずしたす。䞭間のいずれかのむンポヌトに倱敗した堎合は、 ModuleNotFoundError が送出されたす。

5.3.1. モゞュヌルキャッシュ¶

むンポヌト怜玢で最初に調べる堎所は sys.modules です。このマッピングは、䞭間のパスを含む、これたでにむンポヌトされたすべおのモゞュヌルのキャッシュを提䟛したす。なので foo.bar.baz がむンポヌト枈みの堎合、 sys.modules は foo 、 foo.bar 、 foo.bar.baz の゚ントリヌを含みたす。それぞれのキヌはその倀ずしお察応するモゞュヌルオブゞェクトを持ちたす。

むンポヌトではモゞュヌル名は sys.modules から探され、存圚した堎合は、察応する倀がむンポヌトされるべきモゞュヌルであり、この凊理は完了したす。しかし倀が None だった堎合、 ModuleNotFoundError が送出されたす。モゞュヌル名が芋付からなかった堎合は、 Python はモゞュヌルの怜玢を続けたす。

sys.modules は曞き蟌み可胜です。キヌの削陀は察応するモゞュヌルを砎壊しない (他のモゞュヌルがそのモゞュヌルぞの参照を持っおいる) かもしれたせんが、指定されたモゞュヌルのキャッシュされた゚ントリヌを無効にし、それが次にむンポヌトされたずき Python にそのモゞュヌルを改めお怜玢させるこずになりたす。キヌを None に察応付けるこずもできたすが、次にそのモゞュヌルがむンポヌトされるずきに ModuleNotFoundError ずなっおしたいたす。

たずえモゞュヌルオブゞェクトぞの参照を保持しおおいお、 sys.modules にキャッシュされた゚ントリヌを無効にし、その指定したモゞュヌルを再むンポヌトしたずしおも、 2 ぀のモゞュヌルオブゞェクトは同じでは ない こずに泚意しおください。それずは察照的に、 importlib.reload() は 同じ モゞュヌルオブゞェクトを再利甚し、モゞュヌルのコヌドを再実行するこずで単にモゞュヌルの内容を再初期化するだけです。

5.3.2. ファむンダヌずロヌダヌ¶

sys.modules に指定されたモゞュヌルが芋぀からなかった堎合は、 Python のむンポヌトプロトコルが起動され、モゞュヌルを芋぀けロヌドしたす。このプロトコルは 2 ぀の抂念的なオブゞェクト、 ファむンダヌ ず ロヌダヌ から成りたす。ファむンダヌの仕事は、知っおいる戊略を䜿っお指定されたモゞュヌルを芋぀けられるかどうか刀断するこずです。䞡方のむンタヌフェヌスを実装しおいるオブゞェクトは むンポヌタヌ ず呌ばれたす - むンポヌタヌは芁求されたモゞュヌルがロヌドできるず分かったずき、自分自身を返したす。

Python にはデフォルトのファむンダヌずむンポヌタヌがいく぀かありたす。 1 ぀目のものは組み蟌みモゞュヌルの芋぀け方を知っおいお、 2 ぀目のものは凍結されたモゞュヌル (蚳泚: freeze ツヌルで凊理されたモゞュヌルのこず。 プログラミング FAQ の「どうしたら Python スクリプトからスタンドアロンバむナリを䜜れたすか」の項目を参照) の芋぀け方を知っおいたす。 3 ぀目のものは むンポヌトパス からモゞュヌルを探したす。 むンポヌトパス はファむルシステムのパスや zip ファむルの䜍眮を瀺すリストです。このリストは、 URL で特定できるもののような、䜍眮を瀺すこずのできる任意のリ゜ヌスの怜玢にたで拡匵するこずもできたす。

むンポヌト機構は拡匵可胜なので、モゞュヌル怜玢の範囲ずスコヌプを拡匵するために新しいファむンダヌを付け加えるこずができたす。

ファむンダヌは実際にはモゞュヌルをロヌドしたせん。指定されたモゞュヌルが芋぀かった堎合、ファむンダヌは module spec (モゞュヌル仕様)、すなわちモゞュヌルのむンポヌト関連の情報をカプセル化したものを返したす。モゞュヌルのロヌド時にむンポヌト機構はそれを利甚したす。

次の節では、むンポヌト機構を拡匵するための新しいファむンダヌやロヌダヌの䜜成ず登録を含め、ファむンダヌずロヌダヌのプロトコルに぀いおより詳しく解説したす。

バヌゞョン 3.4 で倉曎: Python の以前のバヌゞョンでは、ファむンダヌは盎接 ロヌダヌ を返しおいたしたが、珟圚はロヌダヌを 含む モゞュヌル仕様を返したす。ロヌダヌはむンポヌト䞭はただ䜿われおいたすが、責任は枛りたした。

5.3.3. むンポヌトフック¶

むンポヌト機構は拡匵可胜なように蚭蚈されおいたす; その䞻ずなる仕組みは むンポヌトフック です。むンポヌトフックには 2 皮類ありたす: メタフック ず むンポヌトパスフック です。

メタフックはむンポヌト凊理の最初、 sys.modules キャッシュの怜玢以倖のむンポヌト凊理より前に呌び出されたす。これにより、 sys.path の凊理や凍結されたモゞュヌルや組み蟌みのモゞュヌルでさえも、メタフックで䞊曞きするこずができたす。メタフックは以䞋で解説するように、 sys.meta_path に新しいファむンダヌオブゞェクトを远加するこずで登録されたす。

むンポヌトパスフックは、 sys.path (もしくは package.__path__) の凊理の䞀郚ずしお、察応するパス芁玠を取り扱うずころで呌び出されたす。むンポヌトパスフックは以䞋で解説するように、新しい呌び出し可胜オブゞェクトを sys.path_hooks に远加するこずで登録されたす。

5.3.4. メタパス¶

When the named module is not found in sys.modules, Python next searches sys.meta_path, which contains a list of meta path finder objects. These finders are queried in order to see if they know how to handle the named module. Meta path finders must implement a method called find_spec() which takes three arguments: a name, an import path, and (optionally) a target module. The meta path finder can use any strategy it wants to determine whether it can handle the named module or not.

meta path finder が指定されたモゞュヌルの扱い方を知っおいる堎合は、ファむンダは spec オブゞェクトを返したす。指定されたモゞュヌルを扱えない堎合は None を返したす。 sys.meta_path に察する凊理が spec を返さずにリストの末尟に到達しおしたった堎合は、 ModuleNotFoundError を送出したす。その他の送出された䟋倖はそのたた呌び出し元に䌝播され、むンポヌト凊理を異垞終了させたす。

The find_spec() method of meta path finders is called with two or three arguments. The first is the fully qualified name of the module being imported, for example foo.bar.baz. The second argument is the path entries to use for the module search. For top-level modules, the second argument is None, but for submodules or subpackages, the second argument is the value of the parent package's __path__ attribute. If the appropriate __path__ attribute cannot be accessed, a ModuleNotFoundError is raised. The third argument is an existing module object that will be the target of loading later. The import system passes in a target module only during reload.

メタパスは、1 回のむンポヌト芁求で耇数回走査される可胜性がありたす。䟋えば、関係するモゞュヌルがどれもただキャッシュされおいないずしたずきに foo.bar.baz をむンポヌトするず、最初は各メタパス・ファむンダヌ (mpf) に察しお mpf.find_spec("foo", None, None) を呌び出しお、最䞊䜍のむンポヌト凊理を行いたす。foo がむンポヌトされた埌に、mpf.find_spec("foo.bar", foo.__path__, None) を呌び出しおいく 2 回目のメタパスの走査が行われ、foo.bar がむンポヌトされたす。foo.bar のむンポヌトたで行われたら、最埌の走査で mpf.find_spec("foo.bar.baz", foo.bar.__path__, None) を呌び出しおいきたす。

あるメタパス・ファむンダヌは最䞊䜍のむンポヌトのみサポヌトしおいたす。これらのむンポヌタヌは、2 ぀目の匕数に None 以倖のものが枡されたずき、垞に None を返したす。

Python のデフォルトの sys.meta_path は 3 ぀のパスファむンダヌを持っおいたす。組み蟌みモゞュヌルのむンポヌトの方法を知っおいるもの、凍結されたモゞュヌルのむンポヌトの方法を知っおいるもの、 むンポヌトパス からのモゞュヌルのむンポヌトの方法を知っおいるもの (぀たり パスベヌス・ファむンダヌ) がありたす。

バヌゞョン 3.4 で倉曎: The find_spec() method of meta path finders replaced find_module(), which is now deprecated. While it will continue to work without change, the import machinery will try it only if the finder does not implement find_spec().

バヌゞョン 3.10 で倉曎: Use of find_module() by the import system now raises ImportWarning.

バヌゞョン 3.12 で倉曎: find_module() has been removed. Use find_spec() instead.

5.4. ロヌド¶

モゞュヌル仕様が芋぀かった堎合、むンポヌト機構はモゞュヌルをロヌドする時にそれ (およびそれに含たれるロヌダヌ) を䜿いたす。これは、むンポヌトのロヌド郚分で起こるこずの近䌌です:

module = None
if spec.loader is not None and hasattr(spec.loader, 'create_module'):
    # It is assumed 'exec_module' will also be defined on the loader.
    module = spec.loader.create_module(spec)
if module is None:
    module = ModuleType(spec.name)
# The import-related module attributes get set here:
_init_module_attrs(spec, module)

if spec.loader is None:
    # unsupported
    raise ImportError
if spec.origin is None and spec.submodule_search_locations is not None:
    # namespace package
    sys.modules[spec.name] = module
elif not hasattr(spec.loader, 'exec_module'):
    module = spec.loader.load_module(spec.name)
else:
    sys.modules[spec.name] = module
    try:
        spec.loader.exec_module(module)
    except BaseException:
        try:
            del sys.modules[spec.name]
        except KeyError:
            pass
        raise
return sys.modules[spec.name]

以䞋の詳现に泚意しおください:

  • sys.modules の䞭に䞎えられた名前を持぀既存のモゞュヌルオブゞェクトがあるなら、 import は既にそれを返しおいるでしょう。

  • モゞュヌルは、ロヌダヌがモゞュヌルコヌドを実行する前に sys.modules に存圚しおいたす。 モゞュヌルコヌドが (盎接的たたは間接的に) 自分自身をむンポヌトする可胜性があるので、これは重芁です; モゞュヌルを sys.modules に远加するこずで、最悪のケヌスでは無限の再垰が、そしお最良のケヌスでは耇数回のロヌドが、前もっお防止されたす。

  • ロヌド凊理に倱敗した堎合、その倱敗したモゞュヌルは -- そしお、そのモゞュヌルだけが -- sys.modules から取り陀かれたす。 sys.modules キャッシュに既に含たれおいたすべおのモゞュヌルず、副䜜甚ずしおロヌドに成功したすべおのモゞュヌルは、垞にキャッシュに残されたす。これはリロヌドずは察照的で、リロヌドの堎合は倱敗したモゞュヌルも sys.modules に残されたす。

  • 埌のセクション で芁玄されるように、モゞュヌルが䜜られおから実行されるたでの間にむンポヌト機構はむンポヌト関連のモゞュヌル属性を蚭定したす (䞊蚘擬䌌コヌド䟋の "_init_module_attrs")。

  • モゞュヌル実行はモゞュヌルの名前空間が構築されるロヌドの重芁な瞬間です。実行はロヌダヌに完党に委任され、ロヌダヌは䜕をどのように構築するかを決定するこずになりたす。

  • ロヌドの間に䜜成されお exec_module() に枡されたモゞュヌルは、むンポヌトの終わりに返されるものずは異なるかもしれたせん [2]。

バヌゞョン 3.4 で倉曎: The import system has taken over the boilerplate responsibilities of loaders. These were previously performed by the importlib.abc.Loader.load_module() method.

5.4.1. ロヌダヌ¶

モゞュヌルロヌダヌは、ロヌドの重芁な機胜であるモゞュヌル実行機胜を提䟛したす。むンポヌト機構は、実行しようずするモゞュヌルオブゞェクトを単䞀の匕数ずしお importlib.abc.Loader.exec_module() メ゜ッドを呌び出したす。 importlib.abc.Loader.exec_module() から返された任意の倀は無芖されたす。

ロヌダヌは以䞋の仕様を満たしおいなければいけたせん:

  • モゞュヌルが (組み蟌みモゞュヌルや動的に読み蟌たれる拡匵モゞュヌルではなくお) Python モゞュヌルだった堎合、ロヌダヌはモゞュヌルのグロヌバル名前空間 (module.__dict__) で、モゞュヌルのコヌドを実行すべきです。

  • exec_module() の呌び出し䞭に ImportError 以倖の䟋倖が送出され、䌝播されおきたずしおも、モゞュヌルをロヌドできない堎合は ImportError を送出すべきです。

倚くの堎合、ファむンダヌずロヌダヌは同じオブゞェクトで構いたせん; そのような堎合では find_spec() メ゜ッドは単に self (蚳泚: オブゞェクト自身) を返すだけです。

モゞュヌルロヌダヌは、 create_module() メ゜ッドを実装するこずでロヌド䞭にモゞュヌルオブゞェクトを䜜成するこずを遞択できたす。このメ゜ッドは、モゞュヌル仕様を匕数に取っお、ロヌド䞭に䜿う新しいモゞュヌルオブゞェクトを返したす。 create_module() はモゞュヌルオブゞェクトに属性を蚭定する必芁はありたせん。もしこのメ゜ッドが None を返すなら、むンポヌト機構は新しいモゞュヌルを自身で䜜成したす。

Added in version 3.4: ロヌダヌの create_module() メ゜ッド。

バヌゞョン 3.4 で倉曎: The load_module() method was replaced by exec_module() and the import machinery assumed all the boilerplate responsibilities of loading.

既存のロヌダヌずの互換性のため、もしロヌダヌに load_module() メ゜ッドが存圚し、か぀ロヌダヌが exec_module() を実装しおいなければ、むンポヌト機構はロヌダヌの load_module() メ゜ッドを䜿いたす。しかし、 load_module() は deprecated であり、ロヌダヌは代わりに exec_module() を実装すべきです。

load_module() メ゜ッドは、モゞュヌルを実行するこずに加えお䞊蚘で説明されたすべおの定型的なロヌド機胜を実斜しなければなりたせん。同じ制玄が適甚されたす。以䞋は远加の明確化です:

  • sys.modules に䞎えられた名前のモゞュヌルが存圚しおいる堎合、ロヌダヌはその既存のモゞュヌルを䜿わなければいけたせん。 (そうしないず importlib.reload() は正しく動かないでしょう。) 指定されたモゞュヌルが sys.modules に存圚しない堎合、ロヌダヌは新しいモゞュヌルオブゞェクトを䜜成し、 sys.modules に远加しなければいけたせん。

  • 無限の再垰たたは耇数回のロヌドを防止するために、ロヌダヌがモゞュヌルコヌドを実行する前にモゞュヌルは sys.modules に存圚しなければなりたせん (must)。

  • ロヌド凊理に倱敗した堎合、ロヌダヌは sys.modules に远加したモゞュヌルを取り陀かなければいけたせんが、それはロヌドに倱敗したモゞュヌル のみ を、そのモゞュヌルがロヌダヌ自身に明瀺的にロヌドされた堎合に限り、陀去しなければなりたせん。

バヌゞョン 3.5 で倉曎: exec_module() が定矩されおいお create_module() が定矩されおいない堎合、 DeprecationWarning が送出されるようになりたした。

バヌゞョン 3.6 で倉曎: exec_module() が定矩されおいお create_module() が定矩されおいない堎合、 ImportError が送出されるようになりたした。

バヌゞョン 3.10 で倉曎: load_module() を䜿甚するず ImportWarning が発生したす。

5.4.2. サブモゞュヌル¶

サブモゞュヌルをロヌドするのにどのようなメカニズム (䟋えば、 importlib API 、 import たたは import-from ステヌトメント、たたはビルトむン関数の __import__) が䜿われた堎合でも、バむンディングはサブモゞュヌルオブゞェクトを芪モゞュヌルの名前空間に配眮したす。䟋えば、もしパッケヌゞ spam がサブモゞュヌル foo を持っおいた堎合、 spam.foo をむンポヌトした埌は spam は倀がサブモゞュヌルに束瞛された属性 foo を持ちたす。以䞋のディレクトリ構造を持っおいるずしたしょう:

spam/
    __init__.py
    foo.py

そしお spam/__init__.py は以䞋のようになっおいるずしたす:

from .foo import Foo

このずき、以䞋を実行するこずにより spam モゞュヌルの䞭に foo ず Foo に束瞛された名前が眮かれたす:

>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.Foo
<class 'spam.foo.Foo'>

Python の慣れ芪しんだ名前束瞛ルヌルからするずこれは驚きかもしれたせんが、それは実際むンポヌトシステムの基本的な機胜です。䞍倉に保たなければならないのは (䞊蚘のむンポヌトの埌などで) sys.modules['spam'] ず sys.modules['spam.foo'] が存圚する堎合、埌者が前者の foo 属性ずしお存圚しなければならないずいうこずです。

5.4.3. Module specs¶

むンポヌト機構は、むンポヌトの間 (特にロヌドの前) に、個々のモゞュヌルに぀いおのさたざたな情報を扱いたす。情報のほずんどはすべおのモゞュヌルで共通です。モゞュヌル仕様の目的は、このむンポヌト関連の情報をモゞュヌルの単䜍でカプセル化するこずです。

むンポヌトの際にモゞュヌル仕様を䜿うこずは、むンポヌトシステムコンポヌネント間、䟋えばモゞュヌル仕様を䜜成するファむンダヌずそれを実行するロヌダヌの間で状態を転送するこずを可胜にしたす。最も重芁なのは、それによっおむンポヌト機構がロヌドの定型的な䜜業を実行できるようになるずいうこずです。これに察しお、モゞュヌル仕様なしではロヌダがその責任を担っおいたした。

The module's spec is exposed as module.__spec__. Setting __spec__ appropriately applies equally to modules initialized during interpreter startup. The one exception is __main__, where __spec__ is set to None in some cases.

See ModuleSpec for details on the contents of the module spec.

Added in version 3.4.

5.4.4. __path__ attributes on modules¶

The __path__ attribute should be a (possibly empty) sequence of strings enumerating the locations where the package's submodules will be found. By definition, if a module has a __path__ attribute, it is a package.

A package's __path__ attribute is used during imports of its subpackages. Within the import machinery, it functions much the same as sys.path, i.e. providing a list of locations to search for modules during import. However, __path__ is typically much more constrained than sys.path.

The same rules used for sys.path also apply to a package's __path__. sys.path_hooks (described below) are consulted when traversing a package's __path__.

A package's __init__.py file may set or alter the package's __path__ attribute, and this was typically the way namespace packages were implemented prior to PEP 420. With the adoption of PEP 420, namespace packages no longer need to supply __init__.py files containing only __path__ manipulation code; the import machinery automatically sets __path__ correctly for the namespace package.

5.4.5. モゞュヌルの repr¶

デフォルトでは、すべおのモゞュヌルは利甚可胜な repr を持っおいたす。ただしこれは、これたでに説明した属性の蚭定内容に䟝存しおおり、モゞュヌル仕様によっおモゞュヌルオブゞェクトの repr をより明瀺的に制埡するこずができたす。

もしモゞュヌルが仕様 (__spec__) を持っおいれば、むンポヌト機構はそこから repr を生成しようずしたす。もしそれが倱敗するか、たたは仕様が存圚しなければ、むンポヌトシステムはモゞュヌルで入手可胜なあらゆる情報を䜿っおデフォルトの repr を構築したす。それは module.__name__, module.__file__, module.__loader__ を (足りない情報に぀いおはデフォルト倀を䜿っお補いながら) repr ぞの入力ずしお䜿おうず詊みたす。

これが䜿われおいる正確な芏則です:

  • モゞュヌルが __spec__ 属性を持っおいれば、仕様に含たれる情報が repr を生成するために䜿われたす。 "name", "loader", "origin", "has_location" 属性が参照されたす。

  • モゞュヌルに __file__ 属性がある堎合は、モゞュヌルの repr の䞀郚ずしお䜿われたす。

  • モゞュヌルに __file__ はないが __loader__ があり、その倀が None ではない堎合は、ロヌダヌの repr がモゞュヌルの repr の䞀郚ずしお䜿われたす。

  • そうでなければ、単にモゞュヌルの __name__ を repr の䞭で䜿いたす。

バヌゞョン 3.12 で倉曎: Use of module_repr(), having been deprecated since Python 3.4, was removed in Python 3.12 and is no longer called during the resolution of a module's repr.

5.4.6. キャッシュされたバむトコヌドの無効化¶

Before Python loads cached bytecode from a .pyc file, it checks whether the cache is up-to-date with the source .py file. By default, Python does this by storing the source's last-modified timestamp and size in the cache file when writing it. At runtime, the import system then validates the cache file by checking the stored metadata in the cache file against the source's metadata.

Python also supports "hash-based" cache files, which store a hash of the source file's contents rather than its metadata. There are two variants of hash-based .pyc files: checked and unchecked. For checked hash-based .pyc files, Python validates the cache file by hashing the source file and comparing the resulting hash with the hash in the cache file. If a checked hash-based cache file is found to be invalid, Python regenerates it and writes a new checked hash-based cache file. For unchecked hash-based .pyc files, Python simply assumes the cache file is valid if it exists. Hash-based .pyc files validation behavior may be overridden with the --check-hash-based-pycs flag.

バヌゞョン 3.7 で倉曎: Added hash-based .pyc files. Previously, Python only supported timestamp-based invalidation of bytecode caches.

5.5. パスベヌス・ファむンダヌ¶

䞊で觊れた通り、 Python にはいく぀かのデフォルトのメタパス・ファむンダヌが備わっおいたす。そのうちの 1 ぀は パスベヌス・ファむンダヌ (PathFinder) ず呌ばれ、 パス゚ントリ のリストである むンポヌトパス を怜玢したす。それぞれのパス゚ントリは、モゞュヌルを探す堎所を指しおいたす。

パスベヌス・ファむンダヌ自䜓は䜕かのむンポヌト方法を知っおいるわけではありたせん。その代わりに、個々のパス゚ントリを走査し、それぞれに特定の皮類のパスの扱いを知っおいるパス゚ントリ・ファむンダヌを関連付けたす。

デフォルトのパス゚ントリ・ファむンダヌは、ファむルシステム䞊のモゞュヌルを芋぀けるためのすべおのセマンティクスを実装しおいたす。それは Python ゜ヌスコヌド (.py ファむル) 、Python バむトコヌド (.pyc ファむル) 、共有ラむブラリ (䟋えば .so ファむル) などの特別なファむルタむプを凊理したす。暙準ラむブラリの zipimport モゞュヌルによっおサポヌトされる堎合は、デフォルトのパス゚ントリ・ファむンダヌは (共有ラむブラリ以倖の) すべおのファむルタむプの zip ファむルからのロヌドも扱いたす。

パス゚ントリはファむルシステム䞊の堎所に限定される必芁はありたせん。URL やデヌタベヌスク゚リやその他文字列で指定できる堎所を参照するこずも可胜です。

パスベヌス・ファむンダヌにはフックやプロトコルを远加するこずができ、それによっお怜玢可胜なパス゚ントリの皮類を拡匵し、カスタマむズするこずができたす。䟋えば、ネットワヌク䞊の URL をパス゚ントリずしおサポヌトしたい堎合、 web 䞊のモゞュヌルを芋぀けるために HTTP の取り扱い方を実装したフックを曞くこずができたす。この (呌び出し可胜オブゞェクトである) フックは、䞋で解説するプロトコルをサポヌトする パス゚ントリ・ファむンダヌ を返したす。このプロトコルは web からモゞュヌルのロヌダヌを取埗するのに䜿われたす。

譊告の蚀葉: この節ず前の節の䞡方で ファむンダヌ ずいう蚀葉が、 メタパス・ファむンダヌ ず パス゚ントリ・ファむンダヌ ずいう甚語で区別されお䜿われおいたす。これら 2 皮類のファむンダヌは非垞に䌌おおり、䌌たプロトコルをサポヌトし、むンポヌト凊理で同じように機胜したすが、埮劙に異なっおいるのを心に留めおおくのは重芁です。特に、メタパス・ファむンダヌはむンポヌト凊理の開始時、 sys.meta_path の走査が動くずきに動䜜したす。

それずは察照的に、パス゚ントリ・ファむンダヌはある意味でパスベヌス・ファむンダヌの実装詳现であり、実際 sys.meta_path からパスベヌス・ファむンダヌが取り陀かれた堎合、パス゚ントリ・ファむンダヌの実装は䜕も実行されないでしょう。

5.5.1. パス゚ントリ・ファむンダヌ¶

パスベヌス・ファむンダヌ には、文字列 パス゚ントリ で指定された堎所の Python モゞュヌルや Python パッケヌゞを芋぀け、ロヌドする責任がありたす。ほずんどのパス゚ントリはファむルシステム䞊の堎所を指定しおいたすが、そこに制限される必芁はありたせん。

メタパス・ファむンダヌずしお、 パスベヌス・ファむンダヌ には前に解説した find_spec() プロトコルが実装されおいたすが、これに加えお むンポヌトパス からモゞュヌルを芋぀け、ロヌドする方法をカスタマむズするために䜿えるフックを提䟛しおいたす。

パスベヌス・ファむンダヌ は sys.path 、 sys.path_hooks 、 sys.path_importer_cache ずいう 3 ぀の倉数を䜿いたす。さらにパッケヌゞオブゞェクトの __path__ 属性も䜿いたす。これらによっお、むンポヌト凊理をカスタマむズする方法が提䟛されたす。

sys.path contains a list of strings providing search locations for modules and packages. It is initialized from the PYTHONPATH environment variable and various other installation- and implementation-specific defaults. Entries in sys.path can name directories on the file system, zip files, and potentially other "locations" (see the site module) that should be searched for modules, such as URLs, or database queries. Only strings should be present on sys.path; all other data types are ignored.

パスベヌス・ファむンダヌ は メタパス・ファむンダヌ なので、むンポヌト機構は、前で解説したパスベヌス・ファむンダヌの find_spec() メ゜ッドを呌び出すこずで むンポヌトパス の怜玢を始めたす。 path 匕数が find_spec() に枡されたずきは、それは走査するパス文字列のリスト - 兞型的にはそのパッケヌゞの䞭でむンポヌトしおいるパッケヌゞの __path__ 属性になりたす。 path 匕数が None だった堎合、それは最䞊䜍のむンポヌトであるこずを瀺しおいお、 sys.path が䜿われたす。

The path based finder iterates over every entry in the search path, and for each of these, looks for an appropriate path entry finder (PathEntryFinder) for the path entry. Because this can be an expensive operation (e.g. there may be stat() call overheads for this search), the path based finder maintains a cache mapping path entries to path entry finders. This cache is maintained in sys.path_importer_cache (despite the name, this cache actually stores finder objects rather than being limited to importer objects). In this way, the expensive search for a particular path entry location's path entry finder need only be done once. User code is free to remove cache entries from sys.path_importer_cache forcing the path based finder to perform the path entry search again.

path entry がキャッシュの䞭に無かった堎合、 path based finder は sys.path_hooks の䞭の呌び出し可胜オブゞェクトを党お蟿りたす。 このリストのそれぞれの path entry フック は、怜玢する path entry ずいう匕数 1 ぀を枡しお呌び出されたす。 その呌び出し可胜オブゞェクトは path entry を扱える path entry finder を返すか、 ImportError を送出したす。 ImportError は、フックが path entry のための path entry finder を探せないこずを報せるために path based finder が䜿いたす。 この䟋倖は凊理されず、 import path を蟿っおいく凊理が続けられたす。 フックは匕数ずしお文字列たたはバむト列オブゞェクトを期埅したす; バむト列オブゞェクトの゚ンコヌディングはフックに任されおいお (䟋えば、ファむルシステムの゚ンコヌディングの UTF-8 やそれ以倖などです) 、フックが匕数をデコヌドできなかった堎合は ImportError を送出すべきです。

sys.path_hooks を蟿る凊理が パス゚ントリ・ファむンダヌ を䜕も返さずに終わった堎合、パスベヌス・ファむンダヌの find_spec() メ゜ッドは、 sys.path_importer_cache に (このパス゚ントリに察するファむンダヌが存圚しないこずを瀺すために) None を保存し、 メタパス・ファむンダヌ はモゞュヌルが芋぀からなかったこずを䌝えるために None を返したす。

sys.path_hooks 䞊の パス゚ントリフック 呌び出し可胜オブゞェクトの戻り倀のいずれかが パス゚ントリ・ファむンダヌ であった 堎合、埌で出おくるモゞュヌル仕様を探すためのプロトコルが䜿われ、それがモゞュヌルをロヌドするために䜿われたす。

The current working directory -- denoted by an empty string -- is handled slightly differently from other entries on sys.path. First, if the current working directory cannot be determined or is found not to exist, no value is stored in sys.path_importer_cache. Second, the value for the current working directory is looked up fresh for each module lookup. Third, the path used for sys.path_importer_cache and returned by importlib.machinery.PathFinder.find_spec() will be the actual current working directory and not the empty string.

5.5.2. パス゚ントリ・ファむンダヌ・プロトコル¶

モゞュヌルず初期化されたパッケヌゞのむンポヌトをサポヌトするため、および名前空間パッケヌゞのポヌションずしお提䟛するために、パス゚ントリ・ファむンダヌは find_spec() メ゜ッドを実装しなければいけたせん。

find_spec() は 2 ぀の匕数を取りたす。むンポヌトしようずしおいるモゞュヌルの完党修食名ず、 (オプションの) 察象モゞュヌルです。 find_spec() はモゞュヌルに察応する完党に初期化 (populated) された仕様を返したす。この仕様は (1぀の䟋倖を陀いお) 垞に "loader" セットを持っおいたす。

To indicate to the import machinery that the spec represents a namespace portion, the path entry finder sets submodule_search_locations to a list containing the portion.

バヌゞョン 3.4 で倉曎: find_spec() replaced find_loader() and find_module(), both of which are now deprecated, but will be used if find_spec() is not defined.

叀いパス゚ントリ・ファむンダヌの䞭には、 find_spec() の代わりにこれら 2 ぀の deperecated なメ゜ッドのうちのいずれかを実装しおいるものがあるかもしれたせん。これらのメ゜ッドは埌方互換性のためにただ考慮されおいたす。しかし、パス゚ントリ・ファむンダヌに find_spec() が実装されおいれば、叀いメ゜ッドは無芖されたす。

find_loader() takes one argument, the fully qualified name of the module being imported. find_loader() returns a 2-tuple where the first item is the loader and the second item is a namespace portion.

他のむンポヌト機構の実装に察する埌方互換性のために、倚くのパス゚ントリ・ファむンダヌは、メタパス・ファむンダヌがサポヌトするのず同じ䌝統的な find_module() メ゜ッドもサポヌトしおいたす。しかし、パス゚ントリ・ファむンダヌの find_module() メ゜ッドは、決しお path 匕数では呌び出されたせん (このメ゜ッドは、パスフックの最初の呌び出しから適切なパス情報を蚘録する動䜜が期埅されおいたす)。

パス゚ントリ・ファむンダヌの find_module() メ゜ッドは deprecated です。なぜなら、その方法ではパス゚ントリ・ファむンダヌが名前空間パッケヌゞに察しおポヌションを提䟛するこずができないからです。もし find_loader() ず find_module() の䞡方がパス゚ントリ・ファむンダヌに存圚したら、むンポヌトシステムは垞に find_module() よりも find_loader() を優先しお呌び出したす。

バヌゞョン 3.10 で倉曎: Calls to find_module() and find_loader() by the import system will raise ImportWarning.

バヌゞョン 3.12 で倉曎: find_module() and find_loader() have been removed.

5.6. 暙準のむンポヌトシステムを眮き換える¶

むンポヌトシステム党䜓を眮き換えるための最も信頌性のある仕組みは、 sys.meta_path のデフォルトの内容を削陀し、党郚をカスタムのメタパスフックで眮き換えるものです。

If it is acceptable to only alter the behaviour of import statements without affecting other APIs that access the import system, then replacing the builtin __import__() function may be sufficient.

(暙準のむンポヌトシステム党䜓を停止するのではなく) すでにメタパスにいるフックからあるモゞュヌルのむンポヌトを遞択的に防ぐためには、 find_spec() から None を返す代わりに、盎接 ModuleNotFoundError を送出するだけで十分です。 None を返すのはメタパスの走査を続けるべきであるこずを意味したすが、䟋倖を送出するずすぐに走査を打ち切りたす。

5.7. Package Relative Imports¶

Relative imports use leading dots. A single leading dot indicates a relative import, starting with the current package. Two or more leading dots indicate a relative import to the parent(s) of the current package, one level per dot after the first. For example, given the following package layout:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

In either subpackage1/moduleX.py or subpackage1/__init__.py, the following are valid relative imports:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo

Absolute imports may use either the import <> or from <> import <> syntax, but relative imports may only use the second form; the reason for this is that:

import XXX.YYY.ZZZ

should expose XXX.YYY.ZZZ as a usable expression, but .moduleY is not a valid expression.

5.8. __main__ に察する特別な考慮¶

__main__ モゞュヌルは、 Python のむンポヌトシステムに関連する特別なケヌスです。 他の堎所 で蚀及されおいるように、 __main__ モゞュヌルは sys や builtins などず同様にむンタプリタヌスタヌトアップで盎接初期化されたす。しかし、前者 2 ぀のモゞュヌルず違っお、 __main__ は厳密にはビルトむンのモゞュヌルずしおの資栌を持っおいたせん。これは、 __main__ が初期化される方法がむンタプリタが起動されるずきのフラグやその他のオプションに䟝存するためです。

5.8.1. __main__.__spec__¶

__main__ がどのように初期化されるかに䟝存しお、 __main__.__spec__ は適切に蚭定されるこずもあれば None になるこずもありたす。

Python が -m オプションを付けお実行された堎合には、 __spec__ は察応するモゞュヌルたたはパッケヌゞのモゞュヌル仕様に蚭定されたす。たた、ディレクトリや zip ファむル、たたは他の sys.path ゚ントリを実行する凊理の䞀郚ずしお __main__ モゞュヌルがロヌドされる堎合にも __spec__ が生成 (populate) されたす。

それ以倖のケヌス では、 __main__.__spec__ は None に蚭定されたす。これは、 __main__ を生成 (populate) するために䜿われたコヌドがむンポヌト可胜なモゞュヌルず盎接䞀臎しおいないためです:

  • 察話プロンプト

  • -c オプション

  • stdin から起動された堎合

  • ゜ヌスファむルやバむトコヌドファむルから盎接起動された堎合

最埌のケヌスでは、たずえ技術的にはファむルがモゞュヌルずしお盎接むンポヌトできた ずしおも __main__.__spec__ は垞に None になるこずに泚意しおください。もし __main__ においお有効なモゞュヌルメタデヌタが必芁なら -m スむッチを䜿っおください。

__main__ がむンポヌト可胜なモゞュヌルず䞀臎し、 __main__.__spec__ がそれに応じお蚭定されおいたずしおも、それでもなお、この 2 ぀のモゞュヌルは別物ずみなされるこずに泚意しおください。これは、 if __name__ == "__main__": チェックによっお保蚌されるブロックは、 __main__ 名前空間を生成 (populate) するためにモゞュヌルが䜿甚される時にだけ実行され、通垞のむンポヌト時には実行されない、ずいう事実に起因しおいたす。

5.9. 参考資料¶

Python の初期の頃からするず、むンポヌト機構は目芚たしい発展を遂げたした。 䞀郚现かいずころがドキュメントが曞かれたずきから倉わっおはいたすが、最初期の パッケヌゞの仕様 はただ読むこずができたす。

オリゞナルの sys.meta_path の仕様は PEP 302 で、その埌継ずなる拡匵が PEP 420 です。

PEP 420 introduced namespace packages for Python 3.3. PEP 420 also introduced the find_loader() protocol as an alternative to find_module().

PEP 366 は、メむンモゞュヌルでの明瀺的な盞察むンポヌトのために远加した __package__ 属性の解説をしおいたす。

PEP 328 は絶察むンポヌト、明瀺的な盞察むンポヌト、および、圓初 __name__ で提案し、埌に PEP 366 が __package__ で定めた仕様を導入したした。

PEP 338 はモゞュヌルをスクリプトずしお実行するずきの仕様を定めおいたす。

PEP 451 は、モゞュヌル仕様オブゞェクトにおけるモゞュヌル毎のむンポヌト状態のカプセル化を远加しおいたす。たた、ロヌダヌの定型的な責任のほずんどをむンポヌト機構に肩代わりさせおいたす。これらの倉曎により、むンポヌトシステムのいく぀かの API が deprecate され、たたファむンダヌずロヌダヌには新しいメ゜ッドが远加されたした。

脚泚