Python 모듈 정의 및 가져오기

Beginner

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

소개

이 랩에서는 다른 프로그램에서 가져와 사용할 수 있는 Python 코드를 포함하는 파일인 Python 모듈에 대해 배우게 됩니다. 이러한 모듈식 접근 방식은 코드 재사용을 촉진하고 프로그램을 논리적인 구성 요소로 구성하는 데 도움이 됩니다.

Python 모듈이 무엇이며 왜 유용한지 이해하고, 자신만의 모듈을 만드는 방법을 배우고, 다양한 방식으로 import 문을 사용하는 연습을 하고, 메인 모듈의 개념과 코드가 실행되는 시점을 파악하게 됩니다. 사전 요구 사항으로는 Python 구문 및 함수에 대한 기본적인 이해와 Python 스크립트를 생성하고 실행하는 데 익숙해야 합니다. 이 연습을 시작하기 전에 깨끗한 환경을 위해 Python 인터프리터 세션을 다시 시작하는 것이 좋습니다.

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

Python 모듈 이해하기

Python 에서 모듈은 Python 정의와 문을 담는 컨테이너와 같습니다. 본질적으로 파일이며, 이 파일의 이름은 끝에 .py 확장자가 추가된 모듈 이름입니다. 모듈을 도구 상자라고 생각해보세요. 모듈은 Python 코드를 논리적인 방식으로 구성하여 재사용 및 유지 관리를 용이하게 합니다. 더 나은 구성을 위해 다양한 도구를 별도의 상자에 보관하는 것처럼, 관련 Python 코드를 서로 다른 모듈로 그룹화할 수 있습니다.

이 랩을 위해 설정된 파일을 살펴보겠습니다.

  1. 먼저, 편집기에서 stock.py 파일을 열어 내부를 확인합니다. 이를 위해 다음 명령을 사용합니다. cd 명령은 디렉토리를 파일이 있는 project 폴더로 변경하고, cat 명령은 파일의 내용을 표시합니다.
cd ~/project
cat stock.py

stock.py 파일은 Stock 클래스를 정의합니다. 클래스는 객체를 생성하기 위한 청사진과 같습니다. 이 경우, Stock 클래스는 주식을 나타냅니다. 주식의 이름, 주식 수, 가격에 대한 속성 (특성과 같음) 이 있습니다. 또한 주식의 비용을 계산하는 메서드 (클래스와 관련된 함수와 같음) 도 있습니다.

  1. 다음으로, pcost.py 파일을 살펴보겠습니다. cat 명령을 다시 사용하여 내용을 봅니다.
cat pcost.py

이 파일은 portfolio_cost()라는 함수를 정의합니다. 함수는 특정 작업을 수행하는 코드 블록입니다. portfolio_cost() 함수는 포트폴리오 파일을 읽고 해당 포트폴리오의 모든 주식의 총 비용을 계산합니다.

  1. 이제 샘플 포트폴리오 데이터를 살펴보겠습니다. cat 명령을 사용하여 portfolio.dat 파일의 내용을 봅니다.
cat portfolio.dat

이 파일에는 간단한 형식의 주식 데이터가 포함되어 있습니다. 각 줄에는 주식의 티커 심볼, 주식 수 및 주당 가격이 있습니다.

import 문 사용하기

Python 의 import 문은 현재 프로그램에서 다른 모듈의 코드를 사용할 수 있게 해주는 강력한 도구입니다. 다른 도구 상자에서 도구를 빌리는 것과 같습니다. 다양한 방식으로 코드를 가져오는 연습을 해보겠습니다.

  1. 먼저, Python 인터프리터를 시작해야 합니다. Python 인터프리터는 Python 코드를 실행하는 프로그램입니다. 다음 명령을 사용하여 시작합니다.
python3
  1. 이제 pcost 모듈을 가져와서 어떤 일이 발생하는지 확인해 보겠습니다. import 문을 사용하면 Python 은 pcost.py 파일을 찾고 그 안의 코드를 사용할 수 있도록 합니다.
import pcost

출력 44671.15를 볼 수 있습니다. 이것은 portfolio.dat 파일에서 계산된 포트폴리오의 비용입니다. pcost 모듈이 가져오면 pcost.py 파일의 맨 아래에 있는 코드가 자동으로 실행됩니다.

  1. 다른 포트폴리오 파일로 portfolio_cost() 함수를 호출해 보겠습니다. pcost 모듈에서 함수를 호출하기 위해 pcost.portfolio_cost() 구문을 사용합니다.
pcost.portfolio_cost('portfolio2.dat')

출력은 19908.75여야 하며, 이는 두 번째 포트폴리오 파일의 주식 총 비용을 나타냅니다.

  1. 이제 stock 모듈에서 특정 클래스를 가져오겠습니다. 전체 모듈을 가져오는 대신 from...import 문을 사용하여 Stock 클래스만 가져올 수 있습니다.
from stock import Stock
  1. Stock 클래스를 가져온 후 Stock 객체를 생성할 수 있습니다. 객체는 클래스의 인스턴스입니다. 이름이 GOOG, 주식 수가 100 주, 가격이 490.10Stock 객체를 생성합니다. 그런 다음 주식의 이름을 출력하고 cost() 메서드를 사용하여 비용을 계산합니다.
s = Stock('GOOG', 100, 490.10)
print(s.name)
print(s.cost())

출력은 다음과 같아야 합니다.

GOOG
49010.0
  1. 마지막으로, Python 인터프리터 사용을 마쳤으면 exit() 함수를 사용하여 종료할 수 있습니다.
exit()

이 랩에서는 Python 코드를 가져오는 두 가지 방법을 시연했습니다.

  • import module_name - 전체 모듈을 가져와 해당 모듈의 모든 함수, 클래스 및 변수를 사용할 수 있도록 합니다.
  • from module_name import specific_item - 모듈에서 특정 항목 (클래스 또는 함수) 만 가져오며, 모듈 기능의 일부만 필요한 경우 유용할 수 있습니다.

Python 의 메인 모듈 이해하기

Python 에서 스크립트를 직접 실행하면 "메인" 모듈 역할을 합니다. Python 에는 __name__이라는 특수한 변수가 있습니다. 파일을 직접 실행하면 Python 은 __name__의 값을 "__main__"으로 설정합니다. 이는 파일을 모듈로 가져올 때와는 다릅니다.

이 기능은 파일이 직접 실행되는지 또는 가져오는지에 따라 다르게 동작하는 코드를 작성할 수 있으므로 매우 유용합니다. 예를 들어, 스크립트로 파일을 실행할 때만 실행되고 다른 스크립트에서 가져올 때는 실행되지 않는 코드가 있을 수 있습니다.

메인 모듈 패턴을 사용하도록 pcost.py 수정하기

이 패턴을 활용하기 위해 pcost.py 프로그램을 수정해 보겠습니다.

  1. 먼저, 편집기에서 pcost.py 파일을 열어야 합니다. 다음 명령을 사용하여 프로젝트 디렉토리로 이동하고 파일이 없는 경우 파일을 만들 수 있습니다.
cd ~/project
touch pcost.py

cd 명령은 현재 디렉토리를 홈 디렉토리의 project 디렉토리로 변경합니다. touch 명령은 pcost.py라는 새 파일을 만듭니다 (아직 없는 경우).

  1. 이제 pcost.py 파일을 다음과 같이 수정합니다.
## pcost.py

def portfolio_cost(filename):
    total_cost = 0.0

    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                nshares = int(fields[1])
                price = float(fields[2])
                total_cost += nshares * price
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")

    return total_cost

## This code only runs when the file is executed as a script
if __name__ == "__main__":
    total = portfolio_cost('portfolio.dat')
    print(total)

여기서 주요 변경 사항은 마지막 부분의 코드를 if __name__ == "__main__": 조건으로 묶었다는 것입니다. 즉, 이 블록 내부의 코드는 파일이 모듈로 가져올 때가 아니라 스크립트로 직접 실행될 때만 실행됩니다.

  1. 이러한 변경을 수행한 후 파일을 저장하고 편집기를 종료합니다.

수정된 모듈 테스트하기

이제 수정된 모듈이 어떻게 동작하는지 확인하기 위해 두 가지 방법으로 테스트해 보겠습니다.

  1. 먼저, 다음 명령을 사용하여 프로그램을 스크립트로 직접 실행합니다.
python3 pcost.py

이전과 마찬가지로 출력 44671.15를 볼 수 있습니다. 이는 스크립트를 직접 실행하면 __name__ 변수가 "__main__"으로 설정되므로 if __name__ == "__main__": 블록 내부의 코드가 실행되기 때문입니다.

  1. 다음으로, Python 인터프리터를 다시 시작하고 모듈을 가져옵니다.
python3
import pcost

이번에는 아무런 출력도 보이지 않습니다. 모듈을 가져오면 __name__ 변수가 "__main__"이 아닌 "pcost"(모듈 이름) 로 설정됩니다. 따라서 if __name__ == "__main__": 블록 내부의 코드는 실행되지 않습니다.

  1. portfolio_cost 함수가 여전히 작동하는지 확인하려면 다음과 같이 호출할 수 있습니다.
pcost.portfolio_cost('portfolio.dat')

함수는 44671.15를 반환해야 하며, 이는 제대로 작동하고 있음을 의미합니다.

  1. 마지막으로, 다음 명령을 사용하여 Python 인터프리터를 종료합니다.
exit()

이 패턴은 가져올 수 있는 모듈과 독립 실행형 스크립트 모두로 사용할 수 있는 Python 파일을 만들 때 매우 유용합니다. if __name__ == "__main__": 블록 내부의 코드는 파일이 모듈로 가져올 때가 아니라 직접 실행될 때만 실행됩니다.

자신만의 모듈 만들기

이제 기존 모듈을 사용하는 방법을 이해했으므로 처음부터 새 모듈을 만들 차례입니다. Python 의 모듈은 Python 정의와 문을 포함하는 파일입니다. 코드를 재사용 가능하고 관리 가능한 조각으로 구성할 수 있습니다. 자신만의 모듈을 만들면 관련 함수와 변수를 함께 그룹화하여 코드를 더 모듈화하고 유지 관리를 쉽게 할 수 있습니다.

보고서 모듈 만들기

주식 보고서를 생성하기 위한 간단한 모듈을 만들어 보겠습니다. 이 모듈에는 포트폴리오 파일을 읽고 포트폴리오의 주식에 대한 형식이 지정된 보고서를 인쇄하는 함수가 있습니다.

  1. 먼저, report.py라는 새 파일을 만들어야 합니다. 이를 위해 명령줄을 사용합니다. 홈 디렉토리의 project 디렉토리로 이동하여 touch 명령을 사용하여 파일을 만듭니다.
cd ~/project
touch report.py
  1. 이제 선호하는 텍스트 편집기에서 report.py 파일을 열고 다음 코드를 추가합니다. 이 코드는 두 개의 함수와 메인 블록을 정의합니다.
## report.py

def read_portfolio(filename):
    """
    Read a stock portfolio file into a list of dictionaries with
    keys: name, shares, price
    """
    portfolio = []
    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                stock = {
                    'name': fields[0],
                    'shares': int(fields[1]),
                    'price': float(fields[2])
                }
                portfolio.append(stock)
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")
    return portfolio

def print_report(portfolio):
    """
    Print a report showing the stock name, shares, price, and total value
    """
    print("Name    Shares    Price    Value")
    print("-" * 40)
    total_value = 0.0
    for stock in portfolio:
        value = stock['shares'] * stock['price']
        total_value += value
        print(f"{stock['name']:6s} {stock['shares']:9d} {stock['price']:9.2f} {value:9.2f}")
    print("-" * 40)
    print(f"Total Value: {total_value:16.2f}")

if __name__ == "__main__":
    portfolio = read_portfolio('portfolio.dat')
    print_report(portfolio)

read_portfolio 함수는 주식 정보를 포함하는 파일을 읽고 각 딕셔너리가 name, shares, price 키가 있는 주식을 나타내는 딕셔너리 목록을 반환합니다. print_report 함수는 포트폴리오 (주식 딕셔너리 목록) 를 가져와 주식 이름, 주식 수, 가격 및 총 가치를 표시하는 형식이 지정된 보고서를 인쇄합니다. 마지막의 메인 블록은 파일이 직접 실행될 때 실행됩니다. 포트폴리오 파일을 읽고 보고서를 인쇄합니다.

  1. 코드를 추가한 후 저장하고 편집기를 종료합니다.

모듈 테스트하기

새 모듈이 예상대로 작동하는지 확인하기 위해 테스트해 보겠습니다.

  1. 먼저, 명령줄에서 스크립트를 직접 실행합니다. 이렇게 하면 report.py 파일의 메인 블록이 실행됩니다.
python3 report.py

포트폴리오 주식과 해당 가치를 보여주는 형식이 지정된 보고서가 표시됩니다. 이 보고서에는 주식 이름, 주식 수, 가격 및 총 가치와 전체 포트폴리오의 총 가치가 포함됩니다.

Name    Shares    Price    Value
----------------------------------------
AA         100     32.20   3220.00
IBM         50     91.10   4555.00
CAT        150     83.44  12516.00
MSFT       200     51.23  10246.00
GE          95     40.37   3835.15
MSFT        50     65.10   3255.00
IBM        100     70.44   7044.00
----------------------------------------
Total Value:         44671.15
  1. 다음으로, Python 인터프리터에서 모듈을 사용합니다. 터미널에서 python3 명령을 실행하여 Python 인터프리터를 시작합니다.
python3

인터프리터가 실행되면 report 모듈을 가져와 해당 함수를 사용할 수 있습니다.

import report
portfolio = report.read_portfolio('portfolio.dat')
len(portfolio)  ## Should return 7, the number of stocks
portfolio[0]    ## First stock in the portfolio

import report 문은 report.py 파일에 정의된 함수와 변수를 현재 Python 세션에서 사용할 수 있도록 합니다. 그런 다음 read_portfolio 함수를 사용하여 포트폴리오 파일을 읽고 결과를 portfolio 변수에 저장합니다. len(portfolio) 문은 포트폴리오의 주식 수를 반환하고 portfolio[0]은 포트폴리오의 첫 번째 주식을 반환합니다.

다음 출력이 표시됩니다.

7
{'name': 'AA', 'shares': 100, 'price': 32.2}
  1. 이제 가져온 모듈을 사용하여 포트폴리오의 총 비용을 직접 계산해 보겠습니다. 포트폴리오의 주식을 반복하고 각 주식의 총 가치를 합산합니다.
total = 0.0
for stock in portfolio:
    total += stock['shares'] * stock['price']
print(total)

출력은 44671.15여야 하며, 이는 print_report 함수에서 인쇄된 총 가치와 동일합니다.

  1. 마지막으로, 특정 주식 유형에 대한 사용자 지정 보고서를 만들어 보겠습니다. 포트폴리오를 필터링하여 IBM 주식만 포함한 다음 print_report 함수를 사용하여 해당 주식에 대한 보고서를 인쇄합니다.
ibm_stocks = [stock for stock in portfolio if stock['name'] == 'IBM']
report.print_report(ibm_stocks)

이렇게 하면 IBM 주식과 해당 가치만 표시하는 보고서가 인쇄됩니다.

Name    Shares    Price    Value
----------------------------------------
IBM         50     91.10   4555.00
IBM        100     70.44   7044.00
----------------------------------------
Total Value:         11599.00
  1. 테스트를 마쳤으면 exit() 명령을 실행하여 Python 인터프리터를 종료합니다.
exit()

이제 자신만의 Python 모듈을 성공적으로 만들고 사용했으며, 함수와 파일이 직접 실행될 때만 실행되는 메인 블록을 모두 결합했습니다. 이 모듈식 프로그래밍 방식은 코드를 재사용하고 프로젝트를 더 체계적으로 유지 관리할 수 있도록 합니다.

요약

이 랩에서는 Python 모듈의 기본 개념과 코드 구성을 위해 이를 사용하는 방법을 배웠습니다. 모듈은 재사용 가능한 코드를 포함하는 Python 파일이며, import 문을 사용하면 프로그램에서 다른 모듈의 코드를 활용할 수 있습니다. if __name__ == "__main__" 패턴을 사용하면 파일을 가져올 수 있는 모듈과 독립 실행형 스크립트 모두로 사용할 수 있습니다.

이러한 개념은 특히 더 큰 애플리케이션을 개발할 때 유지 관리 가능한 Python 코드를 작성하는 데 중요합니다. Python 을 계속 배우면서 모듈이 관련 코드를 그룹화하는 데 도움이 되고, 특정 항목을 가져오면 네임스페이스가 깨끗하게 유지되며, 메인 모듈 패턴이 모범 사례임을 기억하십시오. 이러한 기술을 적용하면 코드를 더 체계적이고, 유지 관리 가능하며, 재사용 가능하게 만들 수 있습니다.