[TIL. 28] Python- Module2
1. sys.モジュールとシステム。pathの違い
1)モジュールとパッケージの最初の検索場所
2)簡易辞書からなる
3)インポートしたモジュールとパッケージを保存します.
4)新しくインポートしたモジュールが見つかりません.
1)文字列を持つリスト
2) sys.moduleとbuild-inモジュールをチェックしますが、ない場合は最後の順序で検索します.
3)リストの要素から最後まで検索します.
4)最初のリスト要素から最後まで検索します.
2.sysもインポートするモジュールです。Pythonはsysモジュールの位置をどのように見つけますか? import sys
print(sys)
# <module 'sys' (built-in)>
sysをインポートすると、bullit-inモジュールであることを直接確認できます.
bullit-inモジュールはすでにPythonに含まれているので、Pythonは簡単に見つけることができます.
3.Absolute pathと相対pathの違いについて述べる。
import sys
print(sys)
# <module 'sys' (built-in)>
インポートされたファイルまたはパスにかかわらず、パスは常に同じであるため、絶対パスです.
ファイルのディレクトリがこのように組織されていると仮定します.
from package1 import module1 # module1의 바로 상위 파일은 package1 에서 받아온다.
from package1.module2 import function1 # package1에 있는 module1안에 있는 function1 을 받아온다.
from package2 import class1
from package2.subpackage1.module5 import function2
💡 プロジェクトの最上位ディレクトリに基づいてパスを決定します.したがって,経路は常に同じであるため,絶対経路と呼ぶ.importの位置に基づいてパスを決定します.したがって、local package内に他のlocal packageをインポートする場合に使用します.
上図では、現在の位置がmodule 3であり、class 1とfunction 2を使用したい場合は
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
このように、私が今いる場所に基づいてファイルを検索します.このときは、importを宣言するファイルの現在の場所です.現在の場所から親ディレクトリへのパス
相対パスはパスの長さを短縮できますが、混同やファイルの場所の変更の場合、パスの場所も変更する必要があるため、通常は絶対パスが使用されます.
4.計算パッケージの作成
(init.pyの役割はディレクトリがパッケージであることを知らせることです)
ファイルパスは上と同じで、main.pyから相対パスにadd and multiplyをインポートする場合from .calculator.add_and_multiply import add_and_multiply
# from .calculator.add_and_multiply import add_and_multiply
# ImportError: attempted relative import with no known parent package
次のエラーが発生しました.
エラーメッセージは、相対パスに親パケットがないことを示します.
Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
💡 Pythonの公式ドキュメントでは、mainモジュールの名前は常に__main__
なので、Pythonのメインモジュールとして絶対パスを常に使用する必要があります.from calculator.add_and_multiply import add_and_multiply
# 5
このように、絶対パスに変換するとmoduleをうまく読み込んで使用できます.
4-1. add_and_multiply.pyに複数の関数の絶対パスと相対パスをそれぞれインポートし、メインモジュールとの違いを考慮して結果を出力します。
add_and_multiply.pyでは、絶対パスと相対パスの両方をインポートしても問題ありません.
理由は.
main.pyでは、 __name__ == '__main__'
は常に絶対パスとして使用する必要がありますが、パッケージファイルのファイルでは、モジュールの名前は__name__
に設定されていないので、相対パスでも絶対パスでも使用できます.
5. init.pyファイルの役割
from .calculator.add_and_multiply import add_and_multiply
# from .calculator.add_and_multiply import add_and_multiply
# ImportError: attempted relative import with no known parent package
from calculator.add_and_multiply import add_and_multiply
# 5
add_and_multiply.pyでは、絶対パスと相対パスの両方をインポートしても問題ありません.
理由は.
main.pyでは、
__name__ == '__main__'
は常に絶対パスとして使用する必要がありますが、パッケージファイルのファイルでは、モジュールの名前は__name__
に設定されていないので、相対パスでも絶対パスでも使用できます.5. init.pyファイルの役割
import pkg.mod1
pkg.mod1.func2()
現在,pkgではmod 1,func 2をimport関数の基本手法として用いており,func 2関数を呼び出すたびにすべてのパスを入力する必要があるため,面倒である.しかし、関数名を直接呼び出すことができればinitは便利です.pyで関数のパスを減らすことができます.1) init.まずpyファイルにインポートする関数または変数を書きます.
# __init__.py
from .mod1 import func2
2)必要なファイルから...import ... 形式で使用できます.# main.py
from pkg import func2
func2()
2.変数、関数、クラスの制限モジュール内のすべての関数が外部に露出することを防止し、内部でのみ使用できます.
all変数で定義します.
all変数のdefault値はすべての関数、変数、クラスであるため、all変数を個別に定義してインポート可能な要素を制限できます.
# __init__.py
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
initファイルに露出したくない関数を定義する# main.py
from pkg import *
func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.
all変数はstring値を持つlistであるため、stringを使用してインポートする要素をlistに宣言できます.Reference
この問題について([TIL. 28] Python- Module2), 我々は、より多くの情報をここで見つけました https://velog.io/@jxxwon/TIL.-28-Python-Module2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol