python3 import class in the package

結論から書く。

やりたかったこと、mypackage.mymodule.myclassmypackage.myclassとして呼び出したかった。

見つけたのは2通りの方法。


(1) モジュールをパッケージ名にしちゃう。

/mypackage
  __init__.py (empty)
  mymodule.py
      class myclass:
          pass

main.py
  import mypackage.mymodule as mypackage
  print(mypackage.myclass)
  >>> <class 'mypackage.mymodule.myclass'>

(2) パッケージ側で予めインポートしておく。

/mypackage
  __init__.py
      from .mymodule import myclass

  mymodule.py
      class myclass:
          pass

main.py
  import mypackage
  print(mypackage.myclass)
  >>> <class 'mypackage.mymodule.myclass'>

どっちがスマートなんだろうか?

もしパッケージ内に複数のモジュールが含まれるなら、(1)の方法は使いづらい。が、(2)のパッケージ側で予めインポートした場合、不要なものまで勝手にインポートしちゃってるかもしれん。