パッケージビューの作成

10680 ワード

1.写真と同じディレクトリ構造とファイル内のコードを含むファイルパッケージを直接下に作成します。



試す


📄 ディレクトリ構造



💻 main.py

# 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)

数学者

Traceback (most recent call last):
  File "C:\Users\최대환\PycharmProjects\pythonProject\venv\main.py", line 6, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
  • エラーメッセージを解釈すると、不明な親パケットに相対パスをインポートしようとしていることがわかります.
  • 相対パスは、現在のモジュールの名前に基づいている.メインモジュールの名前は常にmainであるため、メインモジュールとして使用するモジュールは絶対パスを使用してインポートする必要があります.
    参考資料
  • クリスタル


    💻 main.py

    # absoulte path
    from calculator.add_and_multiply import add_and_multiply
    
    
    if __name__ == '__main__':
        print(add_and_multiply(1,2))

    👀 結果

    5

    2. add_and_multiply.pyから複数の関数の絶対パスと相対パスをインポートしてみます!


    絶対パス


    💻 add_and_multiply.py
    from calculator.multiplication import multiply
    
    def add_and_multiply(a,b):
        return multiply(a,b) + (a+b)
    
    print(add_and_multiply(1,2))
    👀 結果
    5

    相対パス


    💻 add_and_multiply.py
    from .multiplication import multiply
    
    def add_and_multiply(a,b):
        return multiply(a,b) + (a+b)
    
    print(add_and_multiply(1,2))
    👀 結果
    ImportError: attempted relative import with no known parent package

    知るところ

  • 絶対パスにインポートしたときに出力された結果は良かったが、相対パスを使用しようとしたときにエラーが発生した.
  • 「ファイルリファレンス」でrunをクリックすると自動的にメインモジュールにファイルが設定され、相対パスではファイルを実行できません.
  • mainモジュールとの違いは?

  • もちろん、メインモジュールは自動的に変更されるので相対パスは使用できませんが、他のPython実行プログラムは、メインモジュールではなく他のモジュールと相対パスに接続できます.
  • __init__.pyファイルの役割は?

  • __init__.pypackageインポート時 __init__.pyファイル内のコードが自動的に実行されます
  • __init__.pyファイルは、通知ディレクトリがパッケージであることを示す役割を果たす.
  • Importは、パスの全長を削減します.
  • 👉 例


    📄 ディレクトリ構造(テストファイルの生成)


    💻 __init__.py
    from .test import hello
    💻 test.py
    def hello():
        print("hello")
    💻 main.py
    from calculator.add_and_multiply import add_and_multiply
    
    if __name__ == '__main__':
        print(add_and_multiply(1,2))
    
    from calculator import hello
    hello()
    👀 結果
    5
    hello
  • Packageは、インポート可能な変数/関数/クラスを制限します.
    💻 __init__.py
  • from .test import hello
    from .add_and_multiply import add_and_multiply
    from .multiplication import multiply
    
    __all__ = ['hello']  #hello함수만 허용해준다.
    💻 main.py
    from calculator import *
    
    hello()
    if __name__ == '__main__':
        print(add_and_multiply(1,2))
    👀 結果
    NameError: name 'add_and_multiply' is not defined
    hello
  • import他のパッケージの場合に実行する必要があるコード.