3

次のコードを使用し__all__てモジュールに入力しています__init__.pyが、より効率的な方法があるかどうか迷っていました。何か案は?

import fnmatch
import os

__all__ = []
for root, dirnames, filenames in os.walk(os.path.dirname(__file__)):
    root = root[os.path.dirname(__file__).__len__():]
    for filename in fnmatch.filter(filenames, "*.py"):
        __all__.append(os.path.join(root, filename[:-3]))
4

2 に答える 2

5

おそらくこれを行うべきではありません: の既定の動作importは非常に柔軟です。モジュール (またはその他の変数) を自動的にエクスポートしたくない場合は、で始まる名前を付けて_ください。python はそれをエクスポートしません。これは標準的な python の方法であり、車輪の再発明は非 pythonic と見なされます。また、モジュール以外にもエクスポートが必要な場合があることを忘れないでください。を設定__all__したら、それらも検索してエクスポートする必要があります。

それでも、エクスポート可能なモジュールのリストを最適に生成する方法を尋ねます。存在しないものをエクスポートすることはできないため、メイン モジュールで認識されている独自のモジュールを確認します。

basedir = os.path.dirname(__file__)
for m in sys.modules:
    if m in locals() and not m.startswith('_'): # Only export regular names
        mod = locals()[m]
        if '__file__' in mod.__dict__  and mod.__file__.startswith(basedir):
            print m

sys.modulesメインモジュールにエクスポートされていない多くのモジュールを含め、python がロードしたすべてのモジュールの名前が含まれていますlocals()

.pyこれは、ファイルシステムをスキャンするよりも高速であり、ディレクトリ ツリー内のすべてのファイルが何らかの形で最上位のサブモジュールになると想定するよりも堅牢です。__init__.py当然、すべてがロードされたときに、このコードを の最後近くで実行する必要があります。

于 2013-02-17T00:18:37.953 に答える