kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Pythonのモジュールとパッケージを確認(できず)

相対指定も試しておく

from .. import sub1

print(sub1.submod1_1.submod1_1_func())

こんなコードを実行してみると

$ python submod2_1.py 
Traceback (most recent call last):
  File "submod2_1.py", line 2, in <module>
    from .. import sub1
ValueError: attempted relative import beyond top-level package

top-levelを超えてるよと言われる

どうやら、メインモジュールのフォルダより上は見えないことになってて
インポートできないということらしい
回避するためにsys.pathディレクトリを追加したり最上位フォルダの
外から実行したりなんかごちゃごちゃやってるようなんだけれども
そんないろいろ工夫しなきゃけいないのはなにかおかしい

下のフォルダのコードが上のフォルダのコードに依存してるっていうのは
若干不自然感もあるのでしようとしてはあってもいいと思うんだけれども
できないならできないで、そういうのはこういうフォルダ構成でやりなさい、
っていう形があるんじゃないか

でもでも

6. Modules — Python 3.7.3 documentationにはこんな構成で
sound.filters.vocoderからfrom sound.effects import echoできるって書いてあるし
from .. import formatsもできるって言ってるんだけどなあ

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              :
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              vocoder.py
              ...

5. The import system — Python 3.7.3 documentationには

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

subpackage1の下からsubpackage2のモジュールをインポートしてるし

PPP3だってMVCのファイル構成例はこうなってるから、testsフォルダのコードで
models.pyをインポートしてるはずだし

project/
 +-- __init__.py
 +-- views.py
 +-- models.py
 :
 +-- tests/
      +-- __init__.py
      +-- test_models.py
      :

できないことはないと思うし、自然な書き方でできていいと思うんだけど

ちょっと力尽きてきたのでこれくらいにする
今これができないと困るってわけではないし
そのうちどこかでそういう構成のプロジェクトを見かけてあーこうやって
やるんだ、みたいなことになることを期待する