35406


以下のようなモジュールを定義したとします。

[code]

    # libmod.py
    import os
    
    def get_cwd():
        os.getcwd()
    
[/code]

利用者はこれをインポートしますが、IDE等の補完候補にlibmod.pyがimportしているosを表示したくないのです。

[code]

    from libmod import os # <= osはlibmodの実装に使っているだけなので候補に出したくない
    
[/code]

ドキュメントをしっかり作成しておけば問題ないと思うのですが、そうではない場合、利用者側にとってどれがこのモジュールが提供する機能なのか判断しづらいように思います。

パッと思いつくのは実装用のモジュールと、公開用のモジュールを別にする方法です。

[code]

    # _libmod.py
    import os
    
    def get_cwd():
        os.getcwd()
    
    # libmod.py
    from ._libmod import get_cwd
    
    # app.py
    from libmod import get_cwd
    
[/code]

ただ、この方法だとファイル数が2倍になってしまい面倒です。何かスマートな解決方法はないでしょうか？


CC BY-SA 3.0
2017-06-08T12:22:39.533
35403
2017-06-11T02:29:24.980
2017-06-11T02:29:24.980
17238
17238
question
python
pythonモジュールのシンボルを指定したものだけ公開したい


IDEが対応しているかどうかによると思いますが、たとえばモジュールに `__all__` を設定したら、自動補完の対象から除外してくれたりしないでしょうか。

<https://docs.python.jp/3/tutorial/modules.html#importing-from-a-package>

もしくは、上記のようなケースで os を候補に出さないIDEを利用するというのが一番良いのかもしれません。少なくとも手元の最新の PyCharm は
一番最初の例で os を候補には出しませんでした。

<https://www.jetbrains.com/pycharm/>


CC BY-SA 3.0
2017-06-08T13:04:19.847
35406
2017-06-08T13:04:19.847
2168
35403
answer


`os`を別名`_os`でimportすればprivate変数扱いになるのでIDEが出さなくなると思います  
（IPython上でしか確認してないですが）

[code]

    import os as _os
    def get_cwd():
        return _os.get_cwd()
    
[/code]


CC BY-SA 3.0
2017-06-08T19:22:06.427
35415
2017-06-08T19:22:06.427
9572
35403
answer