概要
from my_projec_t.utils import function
のようなアンダーバーを2つ使った名前のフォルダ(親ディレクトリ)からインポートしようとするとエラーが発生したのでメモにまとめました。
問題の原因
Pythonでは、モジュール名やクラス名を定義する際にアンダースコア(_
)を使用することがありますが、特にアンダースコアを2つ使用することには注意が必要です。以下にその理由をまとめます。
-
名前マングリングの影響
アンダースコアを2つ使用する名前は、Pythonの名前マングリングの対象となります。この機能は、クラス内部で定義されたメソッドや属性名に特別な処理を施し、外部からアクセスできなくするものです。例えば、__my_variable
という名前は、実際には_ClassName__my_variable
として扱われるため、外部からのアクセスが難しくなります。 -
特殊なシステムレベルの解釈
アンダースコア2つで始まり、かつ2つで終わる名前(例:__name__
)は、Pythonの特別なシステム変数やメソッドを示すために予約されています。これらの名前は、Python内部で特別な処理を受けるため、開発者が独自に定義することは推奨されません。 -
モジュールのインポートエラー
アンダースコアを2つ使用すると、名前解決の際に意図したモジュールやクラスが正しくインポートできないことがあります。これにより、ModuleNotFoundErrorなどのエラーが発生し、プログラムの実行に支障をきたす可能性があります。
推奨事項
モジュール名やクラス名では、アンダースコアを1つだけ使用するか、アンダースコアを使わずに意味のある名前を付けることを推奨します。
- 成功例:
my_project
(アンダースコア1つ) - 失敗例:
my__project
(アンダースコア2つ)
このルールを守ることで、Pythonの名前解決の問題や不具合を避けることができます。適切な命名規則を用いることは、コードの可読性や保守性を高める上でも重要です。
補足
その他のパターンとしては
#エラーなし
from my_project.utils import function
#エラーなし
from myproject.u_til_s import function
だったので、最初のフォルダ名の部分のみ、アンダーバーを合計2つ使わないことを意識すれば良いと思われました。