10

この質問は、Pythonで名前空間パッケージを作成する方法とPython名前空間パッケージを作成するにはどうすればよいですか?

PEP 420、および配布ドキュメントに注意してください。

名前空間パッケージのに他のコードやデータを含めないでください__init__.py。開発中、またはプロジェクトが.eggファイルとしてインストールされている場合は機能しているように見えますが、プロジェクトが「システム」パッケージツールを使用してインストールされている場合は機能しません。このような場合、__init__.pyファイルはインストールされず、実行されることもありません。


これはすべて、独立して分散された拡張サブパッケージを持つ「メインライブラリ」パッケージを持つことを不可能にしているようです。私が欲しいのは、次のことができるようにすることです。

  1. 次のように使用するコアライブラリパッケージを定義します。

    import mylibrary
    
    mylibrary.some_function()
    
  2. 個別にパッケージ化および配布されたライブラリ拡張機能を次のように使用できるようにします。

    import mylibrary.myextension
    
    mylibrary.myextension.some_other_function()
    

名前空間パッケージでこれを実行できると期待していましたが、上記の質問とリンクに基づくと、そうではないようです。これはまったくできますか?

4

2 に答える 2

4

__init__.pyPEP 420 名前空間パッケージの最上位にコードを配置することは実際には不可能です。

私があなたなら、次のいずれかを行います。

  1. 2 つのパッケージを作成します。1 つは実際のライブラリ コードを含む mylibrary (通常のパッケージ) と呼ばれ、もう 1 つは名前空間パッケージである mylibrary_plugins と呼ばれます。
  2. または、コードを含む通常のパッケージである mylibrary.lib と名前空間パッケージである mylibrary.plugins を作成します。

個人的には、オプション 1 を使用します。

__init__.pyPEP 420 の論理的根拠セクションでは、コードを含めることができない理由を説明しています。

于 2013-01-21T15:37:54.303 に答える
1

厳密に言えば、変数を の下mylibraryに置くことはできますが、そこで定義することはできません。たとえば、次のことができます。

# mylibrary/core.py
import mylibrary
def some_function():
    pass

mylibrary.some_function = some_function

ユーザーは次のように使用できます。

import mylibrary.core
mylibrary.some_function()

つまり、インポート以外は、サブパッケージではなくで定義されているように見えるようにmylibrary.coreモンキーパッチを適用します。mylibrarysomefunctionmylibrary

于 2013-08-01T11:01:05.463 に答える