[파이썬 프로그래밍] 프로젝트 모범 사례 [03/8]

1. 설명

        협업과 생산성을 위해 프로젝트를 구성하는 데 도움이 되는 9가지 모범 사례와 예를 다루었습니다. 다음 문서는 데이터 엔지니어, 데이터 과학자, 데이터 분석가, 기계 학습 엔지니어 또는 Python을 처음 접하는 모든 사람이 기본 사항을 숙지할 수 있도록 돕기 위해 설계된 데이터 엔지니어링용 Python 시리즈의 일부입니다. 지금까지 이 초보자 가이드에는 다음이 포함되어 있습니다.

        Python은 데이터 분석부터 웹 개발까지 모든 분야에 사용되는 다목적이며 널리 채택되는 프로그래밍 언어입니다. 그러나 Python 프로젝트의 복잡성이 증가함에 따라 움직이는 모든 부분을 추적하고 모든 것이 구성되어 있는지 확인하는 것이 어려울 수 있습니다.

        Python 파일 구조를 이해하는 것이 도움이 되는 곳입니다. 이 기사에서는 Python 프로젝트 구축에 대한 몇 가지 주요 개념과 이를 가장 잘 적용하는 방법을 검토합니다.

        방금 시작했다면 이러한 모범 사례는 더 나은 코드를 작성하는 데 도움이 될 뿐만 아니라 Python 코드베이스 또는 데이터 파이프라인을 더 잘 유지하고 확장하는 데도 도움이 됩니다.

목차


2. 프로젝트를 분할하는 이유는 무엇입니까?

        Python 프로그램이 커질수록 관리하기가 점점 더 어려워집니다. 팀이 프로젝트에 협력하고 프로젝트의 여러 측면을 동시에 변경하는 경우 특히 그렇습니다.

        프로젝트를 더 쉽게 관리하고 유지할 수 있도록 대규모의 다루기 힘든 프로그래밍 작업을 보다 관리하기 쉬운 하위 작업이나 모듈로 나눕니다. 이름에서 알 수 있듯이 모듈은 여러 위치에서 재사용될 수 있습니다.

        프로젝트를 모듈로 나누는 것을 "모듈형 프로그래밍"이라고 합니다. 이전 기사 에서 언급 했듯이 함수, 모듈 및 패키지는 모듈식 프로그래밍에 사용되는 메커니즘입니다. 모듈식 프로그래밍은 많은 이점을 제공합니다.

  1. 한 번에 하나의 모듈에 집중하여 작업을 간소화 할 수 있습니다 .
  2. 프로젝트를 더 쉽게 유지 관리할 수 있습니다. 팀이 프로젝트를 함께 작업하는 경우 모듈식 접근 방식을 사용하면 작업이 충돌하는 버전으로 끝날 가능성이 줄어듭니다.
  3. 코드를 더 재사용 가능하게 만듭니다. 프로젝트가 대규모 단일체인 경우 이를 재사용하려는 사람은 누구나 많은 코드를 구문 분석해야 합니다. 코드를 모듈로 구성하면 필요한 부분만 가져오기가 더 쉬워집니다.
  4. 중복을 줄여줍니다. 위의 점에 따르면 모듈식 코드는 재사용성이 더 높기 때문에 함수가 중복될 가능성이 줄어듭니다.
  5. 각 모듈이 별도의 네임스페이스를 정의할 수 있으므로 네임스페이스 충돌을 방지하는 데 도움이 됩니다 .

3. Python 프로젝트 구축을 위한 9가지 모범 사례

        Python 코드를 구성하고 작성하는 방법에 대한 조언을 온라인에서 찾아보면 다양한 아이디어를 찾을 수 있습니다. 그러나 실제로는 몇 가지 기본적인 사항으로 귀결됩니다.

3.1 코드 구성

        프로젝트 작업 시 코드를 올바르게 구성하는 것은 매우 중요합니다. 먼저, 코드 자체용, 데이터용, 테스트용, 문서용 등 프로젝트의 다양한 부분에 대해 별도의 폴더를 만들 수 있습니다. 이렇게 하면 필요한 것을 더 빨리 찾을 수 있고 다른 사람들이 귀하의 코드를 더 쉽게 탐색할 수 있습니다.

3.2 일관된 이름 사용

        프로젝트 전체에서 파일과 폴더에 일관된 이름을 사용하는 것이 중요합니다. 변수와 함수에는 밑줄을 사용하고 클래스에는 대문자를 사용하는 등의 규칙을 따르십시오. 이렇게 하면 코드를 더 쉽게 읽고 이해할 수 있습니다.

3.3 버전 관리 사용

        혼자 작업하는 경우에도 Git과 같은 도구를 사용하여 코드 변경 사항을 추적하는 것이 권장되는 모범 사례입니다. 이를 통해 변경 사항을 기록하고 작업 내용을 클라우드 기반 저장소에 쉽게 백업할 수 있습니다. 대부분의 클라우드 기반 Git 솔루션은 개인 실무자를 위한 무료 등급을 제공합니다.

3.4 패키지 관리자 사용하기

        pip와 같은 패키지 관리자를 사용하여 종속성을 관리하면 프로젝트를 실행하는 데 필요한 다양한 소프트웨어를 모두 설치하고 추적하는 데 도움이 됩니다. 이는 종속성이 많은 대규모 프로젝트에서 작업할 때 특히 중요합니다.

3.5 가상 환경 생성

        컴퓨터의 다른 프로젝트에서 프로젝트를 격리하려면 가상 환경을 사용할 수 있습니다 . 이렇게 하면 서로 다른 프로젝트에서 사용되는 패키지 간의 충돌을 방지할 수 있습니다.

3.6 코드에 주석을 달기

        코드가 수행하는 작업과 사용 방법을 설명하는 주석을 추가하는 것은 다른 사람이 코드에 더 쉽게 액세스할 수 있도록 하는 데 중요합니다. 또한 코드를 작성할 때 생각했던 내용을 기억하는 데도 도움이 됩니다.

3.7.테스트

        자동화된 테스트를 사용하여 코드가 예상대로 작동하는지 확인하는 것은 오류를 조기에 포착하는 데 중요합니다. 이렇게 하면 시간을 절약하고 문제를 예방할 수 있습니다.

3.8.러프와 스타일

Ruff  나  Flake8 과 같은 도구를         사용하여   코드의 일관성을 유지하고 일반적인 오류를 포착하면 더 나은 코드를 작성하는 데 도움이 됩니다. 이 도구는 코드가 공식 Python 스타일 가이드 PEP 8과 일치하는지 확인합니다. Black 과 같은 도구를 사용하여  프로젝트 전체에서 코드가 동일하게 보이도록 할 수도  있습니다. 이렇게 하면 일관성을 유지하고 코드를 더 쉽게 읽고 이해할 수 있습니다.

3.9 패키지 및 공유

setuptools와 같은 도구를         사용하여 Python 코드를 패키징하고 배포하면 작업을 다른 사람들과 더 쉽게 공유할 수 있습니다. 이는 또한 다른 사람들이 문제 없이 귀하의 코드를 사용할 수 있도록 하는 데 도움이 됩니다.

4. 데모: 간단한 데이터 엔지니어링 프로젝트

        이러한 팁을 실습 예제에 적용해 보겠습니다. 우리는 정리된 코드, 일관된 이름 지정, 유용한 설명 및 테스트를 포함한 여러 모범 사례를 사용할 것입니다.

        데이터베이스에서 데이터를 추출하고 변환한 후 다른 데이터베이스에 로드하는 스크립트를 작성하겠습니다. 먼저 my_module.py라는 모듈에서 변수와 함수를 정의해 보겠습니다.

# Constants
SOURCE_DB = "source_db"
DESTINATION_DB = "destination_db"
TABLE_NAME = "table_name"
DATE_COLUMN = "date_column"
SALES_COLUMN = "sales_column"

# Functions
def extract_data(table_name):
    # Code to extract data from the source database

def transform_data(data_frame):
    # Code to transform the data

def load_data(data_frame):
    # Code to load the data into the destination database

        이 예에서는 변수와 함수에 일관된 이름을 사용합니다. , 및 와 같은 상수는 대문자로 표시되며 밑줄로 구분됩니다. 및 같은 기능은 모두 소문자이며 밑줄로 구분됩니다.SOURCE_DBDESTINATION_DBTABLE_NAMEDATE_COLUMNSALES_COLUMNextract_datatransform_dataload_data

        다음으로, 코드가 원하는 방식으로 작동하는지 확인하기 위해 파일에 간단한 단위 테스트를 작성해 보겠습니다.test.py

import unittest
import pandas as pd
from my_module import transform_data

class TestDataTransformation(unittest.TestCase):
    def test_transform_data(self):
        # Create a sample input DataFrame
        input_data = pd.DataFrame({
            "date_column": ["2022-01-01", "2022-02-01", "2022-03-01"],
            "sales_column": [100, 200, 300]
        })

        # Call the transform_data function
        output_data = transform_data(input_data)

        # Check the output DataFrame
        expected_output = pd.DataFrame({
            "year": [2022, 2022, 2022],
            "month": [1, 2, 3],
            "sales": [100, 200, 300]
        })

        pd.testing.assert_frame_equal(output_data, expected_output)

        여기서는 and 모듈을 가져오고,unittestpandastransform_datamy_module.py.

        그런 다음 에서 상속되는 이라는 테스트 클래스를 정의하고, 이 클래스 내에서 이라는 단일 테스트 함수를 정의합니다. 이 함수는 세 개의 데이터 행을 포함하는 샘플 입력 데이터 프레임을 생성하고 이 입력 데이터로 함수를 호출한 다음 출력 데이터 프레임을 검사하여 예상 값이 있는지 확인합니다.TestDataTransformationunittest.TestCasetest_transform_datatransform_data

        동일한 세 행의 데이터를 사용하여 예상되는 출력 데이터 프레임을 정의하고 이 함수를 사용하여 출력 데이터 프레임이 예상 데이터 프레임과 일치하는지 확인합니다. 출력 데이터 프레임이 예상 데이터 프레임과 일치하면 테스트가 통과됩니다. 그렇지 않으면 불일치가 발생한 위치에 대한 정보와 함께 테스트가 실패합니다.pd.testing.assert_frame_equal

5. 협업을 위한 구조 프로젝트

        다른 개발자와 함께 코드를 작성할 때 고려해야 할 가장 중요한 사항은 다음과 같습니다.

  • 코드의 버전이 올바른지 확인하세요 .
  • 소프트웨어 종속성을 수정합니다 .

버전 관리 가 유용한 곳         입니다 . 개발 팀이 웹 애플리케이션 개발과 관련된 Python 프로젝트를 진행하고 있다고 가정해 보겠습니다. 각 개발자는 프로젝트의 특정 기능이나 모듈에 대해 작업합니다. 버전 제어가 없으면 팀은 작업을 수동으로 조정해야 하므로 이는 어렵고 오류가 발생하기 쉽습니다. 한 개발자가 실수로 다른 개발자의 작업을 덮어쓰면 진행 상황이 손실되거나 충돌할 수 있습니다.

        그러나 Git과 같은 버전 제어 시스템을 사용하면 팀에서 쉽게 변경 사항을 추적하고, 코드에 대해 협업하고, 모든 사람이 동일한 버전의 코드 베이스에서 작업하도록 할 수 있습니다. Git을 사용하면 각 개발자는 자신의 브랜치에서 작업할 수 있으므로 기본 코드 베이스에 영향을 주지 않고 독립적으로 변경할 수 있습니다.

        모든 사람의 변경 사항을 통합해야 할 때가 오면 Git은 코드를 병합하고 충돌을 해결하기 위한 도구를 제공하여 팀이 더 쉽게 협력할 수 있도록 해줍니다. Git은 또한 각 개발자가 변경한 모든 내용을 포함하여 코드 베이스의 전체 기록을 제공합니다. 이는 시간이 지남에 따라 코드가 어떻게 발전하는지 디버깅하고 이해하는 데 유용합니다.

공유 코드 변경으로 인해 다른 프로젝트가 중단되지 않도록 하려면 pytest  와 같은 자동화된 테스트 도구를         사용하는 것이 가장 좋습니다  . 코드 변경 사항을 기본 코드 베이스에 병합하기 전에 검토하는 것도 좋은 방법입니다.

        마지막으로, 모범 사례 목록에 언급된 것처럼 "손쉬운 공동 작업"에 관해서는 코드를 작성하면서 문서화하는 것이 중요합니다. 이를 통해 새로운 팀 구성원이 코드를 더 쉽게 이해하고 속도를 높일 수 있습니다.

6. Python 프로젝트 폴더 구조 및 키 파일

        Python 프로젝트에 구조가 있는 이유가 궁금할 수도 있습니다. 프로젝트를 구성하는 이러한 방식은 모든 것을 깔끔하게 유지하는 데 도움이 되기 때문에 Python에서 널리 사용됩니다. 최상위 폴더는 "my-project"라고 불리며 전체 프로젝트의 기본 폴더와 같습니다. 대시와 밑줄을 사용하면 항목의 두 수준을 구별하는 데 도움이 됩니다. 특히 밑줄은 대시 표기법을 사용할 수 있는 변수 또는 함수 이름과 프로젝트 참조를 구별하는 데 도움이 됩니다. 대시는 빼기 기호이기도 하기 때문에 Python 패키지의 "내부 수준"을 정의하려면 밑줄을 사용해야 합니다.my-project/my_project

        내 프로젝트에서 파일을 구성하는 방법에 대한 사양이 느슨합니다. 최상위 수준에는 일반적으로 파일과 다양한 구성 파일이 포함됩니다. 프로젝트의 가장 중요한 부분은 Python 패키지 또는 여기에 포함된 패키지입니다. Python 패키지는 Python 가져오기 시스템의 유효한 대상을 형성하고 일반적으로 파일을 포함하는 디렉터리입니다. 이 예에서는 최상위 수준에 "my_project"라는 Python 패키지가 있습니다.README.md__init__.py

        이제부터 대부분의 프로젝트에서 발견되는 주요 파일과 하위 폴더는 다음과 같습니다.

  • 종속성 관리 파일(일반적으로 또는 ) 이 파일은 프로젝트와 해당 종속성을 구성하는 데 사용됩니다. 우리는 이 블로그 시리즈의 2부에서 종속성 관리를 살펴보았습니다 .setup.pypyproject.toml
  • README.md: 이 파일은 마크다운으로 작성되었으며 프로젝트, 목적, 설치 또는 사용 지침을 간략하게 설명합니다.
  • LICENSE: 이 일반 텍스트 파일은 코드가 배포되는 라이선스를 지정합니다. 선택할 수 있는 오픈 소스 라이선스가 많으므로 필요에 맞는 라이선스를 선택하세요.

또한 많은 프로젝트에는 다음과 같은 두 개의 폴더가 있습니다.

  • src/: 이 디렉터리는 Python 패키지를 프로젝트 루트에 직접 배치하지 않으려는 경우 Python 패키지의 대체 위치입니다.
  • tests/: 이 디렉터리에는 프로젝트의 기능을 확인하는 테스트 코드가 포함되어 있습니다. pytest  또는  unittest  와 같은 테스트 프레임워크를 사용하여 테스트를 작성하고 실행할 수  있습니다.

다음...

        우리는 특히 팀의 일원이거나 다른 개발자와 작업을 공유할 계획인 경우 프로젝트 복잡성이 증가함에 따라 Python 프로젝트를 구조화된 방식으로 구성하는 것의 중요성을 공유했습니다. 이 문서에 설명된 모범 사례를 따르면 기본 코드 또는 데이터 파이프라인을 더 쉽게 유지 관리하고 확장할 수 있습니다.

추천

출처blog.csdn.net/gongdiwudu/article/details/132758540