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
:
できないことはないと思うし、自然な書き方でできていいと思うんだけど
ちょっと力尽きてきたのでこれくらいにする
今これができないと困るってわけではないし
そのうちどこかでそういう構成のプロジェクトを見かけてあーこうやって
やるんだ、みたいなことになることを期待する