Python 패키지 생성

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Python 패키지를 생성하고 구성하는 방법을 배우게 됩니다. Python 패키지는 코드를 구조화하여 모듈화, 재사용성 및 유지 관리성을 향상시키는 훌륭한 방법입니다.

이 랩의 목표는 Python 패키지가 무엇인지 이해하고, 기본적인 패키지 구조를 생성하며, 관련 Python 모듈을 응집력 있는 패키지로 구성하고, 새로운 패키지 구조에 맞게 import 문을 업데이트하는 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 67%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Python 패키지 이해

Python 패키지를 만들기 전에, Python 패키지가 무엇인지 이해해 봅시다. Python 패키지는 본질적으로 디렉토리입니다. 이 디렉토리 안에는 Python 코드를 포함하는 .py 파일인 여러 Python 모듈 파일이 있습니다. 또한, __init__.py라는 특수한 파일이 있습니다. 이 파일은 비어 있을 수 있지만, 이 파일의 존재는 해당 디렉토리가 Python 패키지임을 나타냅니다. 이 구조의 목적은 관련 코드를 단일 디렉토리 계층 구조로 구성하는 데 도움을 주는 것입니다.

패키지는 여러 가지 이점을 제공합니다. 첫째, 코드를 논리적으로 구조화할 수 있습니다. 모든 Python 파일이 흩어져 있는 대신, 관련 기능을 패키지로 함께 그룹화할 수 있습니다. 둘째, 모듈 간의 이름 충돌을 방지하는 데 도움이 됩니다. 패키지는 네임스페이스를 생성하므로, 다른 패키지에 동일한 이름을 가진 모듈을 문제없이 가질 수 있습니다. 셋째, 코드를 가져와 사용하는 것이 더 편리해집니다. 전체 패키지 또는 특정 모듈을 쉽게 가져올 수 있습니다.

이제 현재 프로젝트 디렉토리에 있는 파일을 살펴보겠습니다. 파일을 나열하려면 터미널에서 다음 명령을 사용합니다.

ls -l

이 명령을 실행하면 다음과 같은 파일이 표시됩니다.

portfolio.csv
reader.py
stock.py
structure.py
tableformat.py
validate.py

이 Python 파일들은 모두 관련되어 있으며 함께 작동하지만, 현재는 단순히 별도의 모듈입니다. 이 랩에서는 이들을 structly라는 응집력 있는 패키지로 구성하는 것이 목표입니다.

각 파일이 무엇을 하는지 간략하게 이해해 봅시다.

  • structure.py: 이 파일은 기본 Structure 클래스와 다양한 descriptor 를 정의합니다. 이러한 descriptor 는 type validation 에 사용됩니다. 즉, 프로그램에서 사용되는 데이터가 올바른 유형을 갖도록 보장하는 데 도움이 됩니다.
  • validate.py: structure 모듈에서 사용되는 validation 기능을 포함합니다. 이는 특정 규칙에 따라 데이터를 validation 하는 데 도움이 됩니다.
  • reader.py: CSV 데이터를 읽는 데 사용되는 함수를 제공합니다. CSV (Comma-Separated Values) 는 표 형식 데이터를 저장하는 일반적인 파일 형식입니다.
  • tableformat.py: 데이터를 테이블 형식으로 formatting 하는 데 사용되는 클래스와 함수를 포함합니다. 이는 데이터를 더 체계적인 방식으로 표시하려는 경우 유용합니다.
  • stock.py: 다른 모듈을 사용하여 Stock 클래스를 정의하고 주식 데이터를 처리합니다. 다른 모듈의 기능을 결합하여 주식 데이터와 관련된 특정 작업을 수행합니다.

다음 단계에서는 패키지 구조를 만들 것입니다.

패키지 구조 생성

이제 Python 패키지를 만들 것입니다. 하지만 먼저 Python 패키지가 무엇인지 이해해 봅시다. Python 패키지는 관련 Python 모듈을 단일 디렉토리 계층 구조로 구성하는 방법입니다. 코드를 보다 효과적으로 관리하고 재사용하는 데 도움이 됩니다. Python 패키지를 만들려면 다음 단계를 따라야 합니다.

  1. 패키지 이름으로 디렉토리를 만듭니다. 이 디렉토리는 패키지에 속하는 모든 모듈의 컨테이너 역할을 합니다.
  2. 이 디렉토리 안에 __init__.py 파일을 만듭니다. 이 파일은 Python 이 디렉토리를 패키지로 인식하게 하므로 매우 중요합니다. 패키지를 import 하면 __init__.py의 코드가 실행되어 패키지를 초기화하는 데 사용할 수 있습니다.
  3. Python 모듈 파일을 이 디렉토리로 이동합니다. 이 단계는 관련 코드가 모두 패키지 내에서 함께 그룹화되도록 합니다.

단계별로 패키지 구조를 만들어 보겠습니다.

  1. 먼저 structly라는 디렉토리를 만듭니다. 이것이 우리 패키지의 루트 디렉토리가 됩니다.
mkdir structly
  1. 다음으로, structly 디렉토리 안에 빈 __init__.py 파일을 만듭니다.
touch structly/__init__.py

__init__.py 파일은 비어 있을 수 있지만, Python 이 디렉토리를 패키지로 취급하려면 필요합니다. 패키지를 import 하면 __init__.py의 코드가 실행되어 패키지를 초기화하는 데 사용할 수 있습니다.

  1. 이제 Python 모듈 파일을 structly 디렉토리로 이동해 보겠습니다. 이 모듈 파일에는 패키지에 포함하려는 함수와 클래스가 포함되어 있습니다.
mv structure.py validate.py reader.py tableformat.py structly/
  1. 모든 파일이 올바르게 이동되었는지 확인합니다. ls -l 명령을 사용하여 structly 디렉토리의 내용을 나열할 수 있습니다.
ls -l structly/

다음 파일이 나열되어야 합니다.

__init__.py
reader.py
structure.py
tableformat.py
validate.py

이제 기본적인 패키지 구조를 만들었습니다. 디렉토리 계층 구조는 다음과 같아야 합니다.

project/
├── portfolio.csv
├── stock.py
└── structly/
    ├── __init__.py
    ├── reader.py
    ├── structure.py
    ├── tableformat.py
    └── validate.py

다음 단계에서는 패키지가 올바르게 작동하도록 import 문을 수정합니다.

Import 문 수정하기

이제 왜 이렇게 해야 하는지 이해해 봅시다. 파일을 structly 패키지로 옮기면서 Python 이 모듈을 찾는 방식이 변경되었습니다. 각 파일의 import 문은 새로운 패키지 구조에 맞게 업데이트해야 합니다. Python 은 이러한 import 문을 사용하여 다른 모듈의 코드를 찾고 사용하기 때문에 이는 매우 중요합니다.

structure.py 파일은 업데이트하는 데 매우 중요합니다. 이 파일은 validate.py 파일에서 함수와 클래스를 import 합니다. 이 두 파일 모두 이제 동일한 structly 패키지에 있으므로 import 문을 그에 맞게 조정해야 합니다.

먼저 편집기에서 structly/structure.py 파일을 열어 봅시다. 파일 탐색기에서 structly/structure.py를 클릭하거나 터미널에서 다음 명령을 실행할 수 있습니다.

## 파일 탐색기에서 structly/structure.py를 클릭하거나 다음을 실행합니다:
code structly/structure.py

파일이 열리면 import 문의 첫 번째 줄을 살펴봅니다. 현재 다음과 같이 표시됩니다.

from validate import validate_type

이 문은 파일들이 다른 구조에 있을 때 올바르게 작동했습니다. 하지만 이제 Python 에게 현재 모듈과 같은 패키지 내에서 validate 모듈을 찾도록 알려주기 위해 변경해야 합니다. 따라서 다음과 같이 변경합니다.

from .validate import validate_type

여기서 validate 앞의 점 (.) 이 핵심입니다. 이는 Python 에서 상대 import(relative import) 라고 하는 특별한 구문입니다. 이는 Python 에게 현재 모듈 (이 경우 structure.py) 과 같은 패키지 내에서 validate 모듈을 검색하도록 지시합니다.

이 변경을 한 후에는 파일을 저장해야 합니다. 저장은 변경 사항을 영구적으로 만들기 때문에 중요하며, 코드를 실행할 때 Python 은 업데이트된 import 문을 사용합니다.

이제 다른 파일들을 확인하여 업데이트가 필요한지 살펴봅시다.

  1. structly/reader.py - 이 파일은 사용자 정의 모듈에서 아무것도 import 하지 않습니다. 즉, 이 파일에는 아무런 변경도 필요하지 않습니다.
  2. structly/tableformat.py - reader.py 파일과 마찬가지로 이 파일도 사용자 정의 모듈에서 아무것도 import 하지 않습니다. 따라서 여기에서도 변경이 필요하지 않습니다.
  3. structly/validate.py - 이전 두 파일과 마찬가지로 사용자 정의 모듈에서 아무것도 import 하지 않습니다. 따라서 수정할 필요가 없습니다.

실제 프로그래밍에서는 프로젝트 간에 모듈 간의 더 복잡한 관계가 있을 수 있습니다. 패키지 구조를 만들거나 수정하기 위해 파일을 이동할 때 항상 import 문을 업데이트하는 것을 기억하십시오. 이렇게 하면 코드가 필요한 모듈을 올바르게 찾고 사용할 수 있습니다.

stock.py 프로그램 업데이트 및 테스트

이제 패키지를 만들고 내부 import 를 수정했으므로, 새로운 패키지 구조를 사용하도록 stock.py 파일을 업데이트할 차례입니다. Python 에서 패키지는 관련 모듈을 함께 구성하는 방법입니다. 코드베이스를 정리하고 코드를 더 쉽게 관리하고 재사용하는 데 도움이 됩니다.

편집기에서 stock.py 파일을 엽니다.

## 파일 탐색기에서 stock.py를 클릭하거나 실행:
code stock.py

stock.py의 현재 import 는 모든 파일이 동일한 디렉토리에 있던 이전 구조를 기반으로 합니다. Python 에서 모듈을 import 할 때 Python 은 특정 위치에서 모듈을 찾습니다. 이전 구조에서는 모든 파일이 동일한 디렉토리에 있었으므로 Python 이 모듈을 쉽게 찾을 수 있었습니다. 하지만 이제 새로운 패키지 구조를 사용하므로, structly 패키지 내에서 모듈을 찾을 위치를 Python 에 알려주도록 import 를 업데이트해야 합니다.

stock.py 파일을 다음과 정확히 일치하도록 업데이트합니다.

## stock.py

from structly.structure import Structure, String, PositiveInteger, PositiveFloat

class Stock(Structure):
    name = String()
    shares = PositiveInteger()
    price = PositiveFloat()

    @property
    def cost(self):
        return self.shares * self.price

    def sell(self, nshares: PositiveInteger):
        self.shares -= nshares

if __name__ == '__main__':
    from structly.reader import read_csv_as_instances
    from structly.tableformat import create_formatter, print_table
    portfolio = read_csv_as_instances('portfolio.csv', Stock)
    formatter = create_formatter('text')
    print_table(portfolio, ['name','shares','price'], formatter)

주요 변경 사항은 다음과 같습니다.

  1. from structure import Structure, String, PositiveInteger, PositiveFloatfrom structly.structure import Structure, String, PositiveInteger, PositiveFloat로 변경했습니다. 이 변경은 Python 에게 structly 패키지 내에서 structure 모듈을 찾도록 지시합니다.
  2. from reader import read_csv_as_instancesfrom structly.reader import read_csv_as_instances로 변경했습니다. 마찬가지로, 이 변경은 Python 이 structly 패키지 내에서 reader 모듈을 찾도록 지시합니다.
  3. from tableformat import create_formatter, print_tablefrom structly.tableformat import create_formatter, print_table로 변경했습니다. 이렇게 하면 Python 이 structly 패키지에서 tableformat 모듈을 찾을 수 있습니다.

이러한 변경을 수행한 후 파일을 저장합니다. 파일을 저장하는 것은 변경 사항이 저장되고 프로그램을 실행할 때 사용할 수 있도록 하기 때문에 중요합니다.

이제 모든 것이 올바르게 작동하는지 확인하기 위해 업데이트된 코드를 테스트해 보겠습니다.

python stock.py

다음 출력이 표시되어야 합니다.

      name      shares       price
---------- ---------- ----------
      MSFT        100      51.23
       IBM         50       91.1
      AAPL         75     145.89
      ACME        125     123.45
       HPE         75       32.2

이 출력이 표시되면 축하합니다! Python 패키지를 성공적으로 만들고 이를 사용하도록 코드를 업데이트했습니다. 즉, 코드가 이제 더 모듈 방식으로 구성되어 향후 유지 관리 및 확장이 더 쉬워졌습니다.

요약

이 랩에서는 Python 패키지를 만들고 구조화하는 방법을 배웠습니다. 특히, 코드 구성을 위한 Python 패키지의 개념과 유용성을 이해하고, 기본 패키지 구조를 만들고, Python 모듈을 패키지로 이동하고, import 문을 업데이트하고, 패키지를 올바르게 사용하도록 코드를 수정했습니다.

이러한 기술은 더 큰 Python 애플리케이션을 개발하는 데 매우 중요합니다. 적절한 코드 구성이 점점 더 중요해지기 때문입니다. Python 패키지는 관련 코드를 함께 유지하고, 이름 충돌을 방지하며, 코드를 더 재사용 가능하고, 유지 관리 가능하며, 공유 가능하게 만드는 데 도움이 됩니다. 잘 구조화된 패키지는 Python 여정을 계속 진행하면서 전문적인 Python 개발의 초석입니다.