0800: モジュールの公開名¶
問題¶
モジュールの名前空間を表す辞書 namespace から、外部に公開する名前を求める関数 exported_names(namespace) を実装してください。
__all__ がある場合はその内容を公開名として使います。
__all__ がない場合は、アンダースコアで始まらない名前を公開名とします。
制約¶
namespaceは文字列キーを持つマッピングです。__all__がある場合、その値は文字列だけを含むlistまたはtupleとします。__all__がある場合は、そこに書かれた順序を保って返します。__all__がない場合は、公開名を辞書順に並べて返します。__all__の値が不正なときはTypeErrorを送出します。
例¶
>>> exported_names({"open": object(), "_helper": object(), "close": object()})
['close', 'open']
>>> exported_names({"__all__": ["run", "stop"], "run": object(), "_stop": object()})
['run', 'stop']
>>> exported_names({"__all__": "run"})
Traceback (most recent call last):
...
TypeError: __all__ must be a list or tuple of strings
発展¶
__all__ に存在しない名前が含まれている場合を検出し、例外として報告する仕様に拡張してください。
参考¶
- 『Python Distilled』第8章「モジュールから選んでインポートする」
- 『Python Distilled』第8章「パッケージにおける名前空間の制御」
- 『Python Distilled』第8章「公開するパッケージの制御」