75895


Djangoのチュートリアルをやっていて気になる箇所があるので質問させて下さい。

DjangoではSECRET_KEYがsettings.pyに直接書かれているので、local_settings.pyを新たに作成してそこにシークレットキーを書き込んみ
`from .local_settings import SECRET_KEY as key`
でsettings.py側で読み込んでいます。その際に使用する `.`
これはlocal_settings.pyとsettings.pyが同じ階層にある事を示していると思っていました。

しかし試しに上記のファイルと同じ階層にtest.pyとtest2.pyを作成して同じようにtest.pyに書いた変数をtest2.pyで読み込んで見ようとしたのですが、`.`を使用すると
`ImportError: attempted relative import with no known parent package` とエラーになり
`.`を外すと上手く読み込まれます。なぜこのようになるのでしょうか？  
pythonの `import` がどのように動作しているのかまだ自信がないです。  
詳しい方、教えて頂けないでしょうか？  
よろしくお願いします。

test.py

[code]

    hello = "hello"
    
[/code]

test2.py

[code]

    # .testとするとImportError: attempted relative import with no known parent package
    # と表示される。
    from test import hello as A
    
    print(A)
    
[/code]


CC BY-SA 4.0
2021-05-17T08:09:57.157
75892
2021-05-17T12:27:25.400
22565
question
python python3 django
Python（Django）のimportの際に使用する.（ドット）がどのように使用されるのか分からない。


ここに答えがあるようですね。パッケージ内の相対インポートという物で使うための物のようです。  
[Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定](https://note.nkmk.me/python-relative-
import/)

> パッケージを自作する場合、...途中省略...そのようなときは、相対パスで相対的な位置を指定してインポート（相対インポート）することができる。

>
> パッケージ内のファイルのように、他のファイルからモジュールとしてインポートされるファイルの中では相対パスを使えるが、pythonコマンドなどで実行されるファイルの中では相対パスは使えないので注意。

つまり単体のスクリプトである`test.py`と`test2.py`はパッケージの構成部品では無いので、`from
import`の先頭に`.`は使えないということなのでしょう。

[6.4.2. パッケージ内参照](https://docs.python.org/ja/3/tutorial/modules.html#intra-
package-references)

> 相対 import は現在のモジュール名をベースにすることに注意してください。メインモジュールの名前は常に`"__main__"`なので、Python
> アプリケーションのメインモジュールとして利用されることを意図しているモジュールでは絶対 import を利用するべきです。


CC BY-SA 4.0
2021-05-17T11:38:39.520
75895
2021-05-17T12:27:25.400
2021-05-17T12:27:25.400
26370
26370
75892
answer