[TIL_Python]Modules & Packages_2


1. sys.モジュールとシステム。パスの違いを述べてください。


sys.モジュールは辞書形式、sysです.pathはList形式です.
sys.ModulesはPythonが最初に経路を探した場所、sysです.パスは最後に見た場所です.

2.sysもインポートするモジュールです。Pythonはsysモジュールをどのように位置決めしますか?


sys.modules->built-in modules-> sys.パス順に見て探します.

3.Absolute pathと相対pathの違いを述べてください。


Absolute pathは、最上位ディレクトリツリーから開始してパスを延長できますが、pathに対してインポート位置に基づいて開始するため、パスの長さが減少します.

4.計算パッケージの作成


将来の開発では、大量のパッケージを使用して作成する必要がある場合があります.そのため、これは非常に困難なタスクです.
Pythonは、ローカル環境でインストールして実行してください.
ディレクトリ構造は次のとおりです.各ファイルのコード内容は次のとおりです.__init__.py ファイルには何のコードもありませんが、initファイルの役割はディレクトリがパッケージであることを知らせることです.

main.py
 
# absoulte path
#from calculator.add_and_multiply import add_and_multiply 

# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
add_and_multiply.py
 
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b):
    return(a*b)

そうします.

5. main.pyからadd and multiplyを相対パスにインポートしたときに発生したエラーを確認します。


以下のPython公式ドキュメントを参照して、mainモジュールにパッケージ内のモジュールをインポートする方法を記録してください.
https://docs.python.org/3/tutorial/modules.html#intra-package-references
上のとおりにするpyを実行すると、次のエラーが発生します.

このエラーはmainです.pyファイルが最上位ファイルであることを教えてください.
アノテーションがパスに対して絶対パスとしてインポートされた場合、出力される結果は次のとおりです.

6. add_and_multiply.pyに複数の関数の絶対パスと相対パスをそれぞれインポートし、メインモジュールとの違いを考慮して結果を出力します。


相対パスにインポート時:エラー

絶対パスにインポートした場合:実行されます.
add_and_multiply.pyはコンピュータパッケージモジュール、mainです.pyはadd and multiplyです.pyモジュールの関数が実行されるモジュールを受け入れます.

7. init.pyファイルの役割も整理してブログを書いてください。

__init__メソッドはclass実体化時に使用される関数です.__init__メソッドは呼び出されていないが、クラス実体化時に自動的に呼び出される__init__メソッド.
  • __init__.pyファイルには何のコードもありませんが、ディレクトリがパッケージであることを知らせる役割を果たしています.
  • 減少経路毎回すべてのパスを入力する必要があります.init.パスをpyファイルにインポートすると、他のファイルは短い出力ができます.
  • importの変数/関数/クラスを制限可能
    内部でのみ使用される関数がパッケージ外部からインポートされて使用されないように、__all__変数を指定できます.
    パッケージでインポートできる要素はすべて__all__変数で定義されています.__all__変数のデフォルト値は、すべての関数/変数/クラスです.__all__変数を個別に定義してインポート可能な要素を制限できます.__all__変数はstring値要素を持つリストです.
    stringを使用してlistにインポートする要素を宣言します.
  •  __init__.py
    from .mod1 import func2
    from .mod2 import func3
    
    __all__ = ['func2', 'func3']
     main.py
    from pkg import *
    
    func2()
    func3()
    func4() ## <== Error. func4 함수는 `__all__` 에 정의되지 않았으므로 import 될 수 없음.