1

__all__モジュールのプロパティを介してモジュールで定義された関数を公開するために使用する非常に単純なデコレータ関数があります。パッケージ内の複数のモジュールに使用するため、パッケージの__init__.py.

モジュール(またはパッケージ)の を参照するため、定義内から使用できないため、現在次のようにしてい__all__ます。__all____init__.py

def expose ( fn ):
    fn.__globals__['__all__'].append( fn.__name__ )

これは完全にうまくいくようです。ただし__global__、特にそのプロパティが文書化されていないように見えるため、プロパティを使用することが理想的な方法であるかどうかはわかりません(少なくともドキュメントには何も見つかりませんでした)。

そのためにうまく使用__globals__していますか、それともこれを機能させるためのより簡単で堅牢な方法がありますか?

編集:

__all__明確にするために、必ずしもモジュールのプロパティにアクセスする必要はありません。別の名前を簡単に使用して、同じ質問になってしまう可能性があります。__all__モジュール内のすべての公開オブジェクトを保持するという目的が私の意図と一致するため、使用しています。しかし同時に、私はそれに名前を付けることもできましたexposedFunctions。したがって、問題は、モジュールのグローバル プロパティにアクセスする方法についてです。

4

1 に答える 1

2

AllListThomas Rachel のデコレータが好きかもしれません:

class AllList(list):
    """list which can be called in order to be used as a __all__-adding decorator"""
    def __call__(self, obj):
        """for decorators"""
        self.append(obj.__name__)
        return obj 

どこからでもインポートし、モジュールの上部に

__all__ = whereever.AllList()

次に、モジュールでは次のようになります

@__all__
def some_func():
...

@__all__
def another_func():
...

グローバルについて心配する必要はありません。

アップデート

グローバルについて本当に心配したい場合は、別のモジュールのコンテキストでクラスを使用するをご覧ください。しかし、それはきれいではありません。

于 2011-10-06T23:31:58.280 に答える