Module & Packages
モジュール
モジュールとは
Pythonでは、moduleは変数、関数、クラスなどを集めたファイルです.
モジュールを使用する理由
ファイルが大きすぎて、別のファイルで繰り返し使用できず、コード全体が1つのファイルに置かれている場合は、複数のファイルに分けてクリーンアップおよび管理できます.
モジュールの使用
## my_module.py
def getSum(a,b):
return a+b
def getDiff(a,b):
if a > b:
return a-b
else:
return b-a
2-1. モジュールの読み込みと使用-importキーのみで読み込みimport
## main.py
import my_module
x = 2
y = 3
print(my_module.getSum(x,y)) # => 5
print(my_module.getDiff(x,y)) # => 1
2-2. from importキーワードの使用from
## main.py
from my_module import getSum, getDiff
print(getSum(2,3)) # => 5
print(getDiff(5,2)) # => 3
from## main.py
from my_module import *
print(getSum(2,3)) # => 5
print(getDiff(5,2)) # => 3
2-3. import as-モジュールまたはモジュールにインポートする要素に新しい名前を付けることができます.main.py
## main.py
import my_module as mm
print(mm.getSum(2,3)) # => 5
print(mm.getDiff(5,2)) # => 3
## main.py
from my_module import getSum as gs
from my_module import getDiff as gd
print(mm.gs(2,3)) # => 5
print(mm.gd(5,2)) # => 3
ほうそう
パッケージとは?
モジュールと同様に、これは他のファイルからロードされて使用される概念であり、モジュールよりも大きく複雑なコードであることを区別します.モジュールは簡単なPythonファイルですが、パッケージはPythonファイルからなるディレクトリです.
上記の構成が画像のようなものであると仮定すると、以下のように使用することができる.import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func2()
func2()
import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func2()
func2()
e.g.) pip install Django
Package Initialization
パッケージのインポート時に初期設定が必要な場合があります.
Pythonはinitです.パッケージの初期設定はpyファイルで実現します.
パッケージ内でinit.pyファイルがある場合は、パッケージのインポート時にinitします.pyファイルのコードが自動的に実行されます.
__intit__.pyでできること
パスの全長を小さくする
__init__.まずpyファイルをインポートします.
__init__.pyファイルで関数のパスを減らすことができます.
#__init__.py
from .mod1 import func2
#main.py
from pkg import func2 #모듈을 언급하지 않아도 됨
func2()
制限変数/関数/クラス
モジュール内のすべての関数は外部に露出できない可能性があります.パッケージの外部でこれらの関数をインポートおよび使用しないようにall変数を指定することもできます.
パッケージでインポートできるすべての要素はall変数で定義されます.
また、all変数のデフォルト値は、すべての関数/変数/クラスです.
したがって、all変数を個別に定義して、インポート可能な要素を制限することができます.
all変数はstring値要素を持つlist(list of strings)である.
したがってstringを使用して、インポートする要素をlistに宣言できます.
# __init__.py
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
# main.py
from pkg import func2
from pkg import func3
func2()
func3()
func4() ## <=Error. func4 함수는 __all__에 정의되지 않았음.
import statement
モジュールとパッケージについて簡単に説明します.では、モジュールとパッケージをロードするときに使用する「import」が、モジュールとパッケージをどのように検索するかについて説明します.
Import Searchシーケンス
たとえば、pkgというパッケージがあるとします.このパッケージを使用するには、次のようにインポートする必要があります.import pkg
コードのみを表示する場合、「pkg」はモジュール(Pythonファイル)またはモジュールを含むディレクトリ、または両方のいずれかです.したがって、Pythonは、インポートのためにファイルまたはディレクトリのパスを見つけることができる必要があります.
Pythonがモジュールまたはパッケージを検索するときの検索順序は以下の通りです.
1. sys.modules
2. built-in modules
3. sys.path
sys.modules
パイソンがモジュールやpackageを見つけるために最初に確認した場所です.
sys.モジュールは辞書で、インポートしたモジュールとパッケージが格納されています.
つまり、一度に導入したモジュールやパッケージには、Pythonを再検索する必要がない機能があります.
新しくインポートしたモジュールはsysです.モジュールに見つかりません.
built-in modules
これらはPythonが提供するPython公式ライブラリです.
Built-inモジュールはすでにPythonに含まれているため、Pythonは簡単に見つけることができます.
sys.path
sys.pathのデフォルトはlistで、string要素が含まれています.各string要素はパスを表し、以下に示す.['/run_dir', '/usr/local/lib/python38.zip',
'/usr/local/lib/python3.8',
'/usr/local/lib/python3.8/lib-dynload',
'/home/runner/.local/share/virtualenvs/python3/lib/python3.8/site-packages']
これらのリストの各パスを確認し、これらのパスにインポートするパッケージがこれらのパスにあるかどうかを確認します.
sys.モジュールとシステム。pathの違い
sys.modulesには、インポートしたモジュールまたはパッケージ、sysが表示されます.pathには、モジュールまたはパケットの検索時に検索されるパスが表示されます.
Sysもインポートが必要なモジュールですが、Pythonはsysのモジュールをどのように位置決めしますか?
sys.モジュールを印刷するとsysというモジュールが内蔵モジュールであることがわかります.
Absolute Path & Relative Path
Pythonの内蔵モジュールとpipでインストールされる外部モジュールとパッケージは、通常、インポートにとって大きな問題ではありません.Built-inモジュールはもちろんよく探していますが、pipでインストールされた外務モジュールもsite-packagesというディレクトリに自動的にインストールされます.このsite-packagesはsysです.パスは既に含まれているので、検索に問題はありません.
問題は直接開発したローカルパッケージです.自分が開発したlocal packageをインポートする場合は、packageの場所に基づいてインポートパスを正しく宣言します.Local packageをインポートするパスには、絶対パスと相対パスがあります.
絶対パス
インポートしたファイルまたはパスにかかわらず、パスは常に同じです.
すべてのパスの開始点は、プロジェクトの最上位ディレクトリから始まります.
プロジェクトでは、どのファイル、どの場所からインポートしてもパスは常に固定されているため、プロジェクトのトップディレクトリに対してパスは絶対パスと呼ばれます.
一般的にlocalpackageをインポートするときにabsolute pathを使用できます.しかし、absolute pathを使用する欠点は、経路が長くなる可能性があることです.これらの欠点を補うために、相対パスを使用することができる.
相対パス(Relative Path)
Relative pathはabsolute pathとは異なり、プロジェクトのトップディレクトリではなく、インポートされた場所に基づいて定義されます.したがって、通常、相対パスを使用してlocalパケットから他のlocalパケットをインポートします.
Relative pathの利点は、宣言するパスの長さを減らすことですが、混同しやすく、ファイルの場所が変更された場合、パスの場所も変更する必要があります.したがって,一般的には絶対pathを用いることを推奨する.
注意事項
正式なドキュメントを参照すると、相対パスを使用しないでくださいというメッセージが表示されます.
本文
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.
ハングルの翻訳
相対パスは、現在のモジュールの名前に基づいています.メインモジュールの名前は常にmainであるため、Pythonアプリケーションのメインモジュールに使用するモジュールは常に絶対パスを使用する必要があります.
コンテンツ上、Pythonがプロジェクトにパスを設定する場合は、プライマリ・ファイルに基づいているため、プライマリ・モジュールに絶対パスを指定する必要がある場合があります.(もちろん、大脳皮質)
import pkg
['/run_dir', '/usr/local/lib/python38.zip',
'/usr/local/lib/python3.8',
'/usr/local/lib/python3.8/lib-dynload',
'/home/runner/.local/share/virtualenvs/python3/lib/python3.8/site-packages']
Reference
この問題について(Module & Packages), 我々は、より多くの情報をここで見つけました https://velog.io/@dooyeonk/Module-Packagesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol