[Python 프로그래밍] Python에서 힌트 입력하기 [06/8]

목차

1. 설명

2. 동적 유형이란 무엇입니까?

2.1 유형 힌트를 사용하는 이유는 무엇입니까?

2.2 제한 사항

3. 기본 유형 팁

       3.1 변수 유형 선언

       3.2 함수 설명

4. Python의 내장 유형

4.1 원자형과 복합형

5. 함수 설명

5.1 함수의 매개변수 유형과 반환 유형을 지정하는 방법

5.2 함수 시그니처에 유형 힌트를 사용하는 예

6. 복잡한 유형

6.1 리스트, 딕셔너리, 튜플, 세트

6.2 선택 사항

6.3 연합

6.4 모두

7가지 사용자 정의 유형

7.1 클래스를 사용하여 자신만의 유형 정의

7.2 유형 힌트의 경우 Type

7.3 다양한 유형의 NewType을 만드는 데 사용됩니다.

8. 제네릭

8.1 유형 변수

8.2 일반사항

아홉, 유형 검사 파이라이트

9.1 유형 검사기를 사용하여 유형을 확인하는 방법

9.2 정적 및 동적 유형 확인

10. 힌트와 독스트링을 입력하세요

11. 결론


1. 설명

        Python 데이터 엔지니어링 시리즈의 여섯 번째 기사에서는 유형 힌트가 오류를 줄이는 방법을 살펴보았습니다. 다음 문서는 데이터 엔지니어, 데이터 과학자, 데이터 분석가, 기계 학습 엔지니어 또는 Python을 처음 접하는 모든 사람이 기본 사항을 숙지할 수 있도록 돕기 위해 설계된 데이터 엔지니어링용 Python 시리즈의 일부입니다. 지금까지 이 초보자 가이드에는 다음이 포함되어 있습니다.

        명확하고 신뢰할 수 있는 코드를 촉진하기 위해 Python이 제공하는 강력한 도구 중 하나는 "유형 힌트" 개념입니다. " 파이썬은 동적으로 유형이 지정되는 언어인데 왜 유형에 신경을 써야 합니까? " 라고 궁금해하실 수도 있습니다.

        코딩 모범 사례에 관심이 있는 데이터 엔지니어 또는 Python 초보자로서 Python 코드의 유형 힌트를 이해하고 적용하는 것은 실제 자산이 될 수 있습니다.

        이 기사에서는 유형 힌트, 응용 프로그램 및 Python 프로그래밍의 이점을 자세히 살펴보겠습니다. Dagster는 유형 주석 프레임워크 이므로  데이터 엔지니어링 파이프라인에서 유형을 사용하여 가독성을 높이고 오류 가능성을 줄이는 방법도 설명합니다. 이는 미래의 자신과 코드와 상호 작용할 다른 개발자를 위해 지도(함수와 클래스로 들어오고 나가는 데이터 유형을 자세히 설명하는 지도)를 제공하는 것과 같습니다.

2. 동적 유형이란 무엇입니까?

        Python은 동적 유형 지정 언어입니다. Java나 C++와 같은 정적인 유형의 언어에서는 변수를 사용하기 전에 변수의 유형을 선언해야 합니다. 예를 들어 변수가 정수, 부동 소수점, 문자열 등인지 지정해야 합니다. Python에서는 런타임 전에 데이터 유형을 생각하지 않고 코딩할 수 있습니다. 이는 Python을 특히 초보자에게 적합하게 만드는 기능 중 하나입니다.

        예를 들어, 변수를 선언하고 해당 유형을 지정하지 않고 변수에 직접 값을 할당할 수 있으므로 "동적 유형 지정"이라는 이름이 붙었습니다. Python 인터프리터는 런타임에 값과 해당 유형을 암시적으로 바인딩합니다.

x = 10       # x is an integer
x = "Hello"  # now x is a string 

        첫 번째 줄의 는 정수입니다. 두 번째 줄에서는 동일한 내용이 문자열이 됩니다. 동적 타이핑 특성으로 인해 Python은 이 변환을 원활하게 처리할 수 있습니다.xx

        그러나 이러한 동적 특성으로 인해 디버깅하기 어려운 버그가 발생할 수도 있습니다. 특히 대규모 코드 베이스나 복잡한 데이터 처리 파이프라인에서는 데이터 흐름이 즉시 명확하지 않을 수 있습니다.

        PEP 484를 통해 표준 라이브러리의 일부로 Python 3.5에 도입된 유형 힌트를 사용하면 변수, 함수 매개변수 또는 반환 값의 예상 유형을 지정할 수 있습니다.

2.1 유형 힌트를 사용하는 이유는 무엇입니까?

동적 유형 지정은 유연성을 제공하지만 잠재적인 오류가 발생할 여지도 만듭니다. 여기서 유형 힌트가 제공됩니다. 코드 가독성을 크게 향상시키고 유형 관련 오류를 방지할 수 있습니다.

향상된 코드 가독성: 유형 힌트는 개발자가 함수에서 예상하는 매개변수 유형과 반환되는 내용을 이해하는 데 도움이 되는 문서 형식으로 작동합니다. 이렇게 향상된 명확성은 코드를 더 읽기 쉽고 이해하기 쉽게 만듭니다.

오류 감지: "pyright"와 같은 도구를 사용하여 Python 코드를 정적으로 분석할 수 있습니다. 유형 힌트를 기반으로 코드의 유형 일관성을 확인하고 런타임 전에 유형 관련 오류를 경고합니다. Dagster 팀이 mypy를 완전히 건너뛰고 pyright만 사용하도록 권장하는 이유를 알아보세요.mypy

더 나은 IDE 지원: 많은 IDE(통합 개발 환경) 및 Linter는 유형 힌트를 활용하여 더 나은 코드 완성, 오류 검사 및 리팩토링을 제공할 수 있습니다.

대규모 프로젝트 촉진 : 개발자가 여러 명인 대규모 프로젝트의 경우 유형 힌트는 전체 코드 베이스의 데이터 구조와 흐름을 이해하는 데 매우 유용할 수 있습니다. 공개 Python 프로젝트 유형 주석을 포함하고 유지 관리하는 방법에 대한 지침을 게시했습니다 .

2.2 제한 사항

런타임 시 적용되지 않음:  Python의 유형 힌트는 적용되지 않고 힌트만 적용되며, 제공된 유형이 실제 값과 일치하지 않는 경우 Python 인터프리터는 오류를 발생시키지 않습니다. 이는 유형 힌트가 유형 안전성을 강화하지만 그렇지 않다는 오해로 이어질 수 있습니다.

지나치게 복잡함 : 작거나 간단한 스크립트의 경우 유형 힌트가 과도해 보일 수 있으며 그렇지 않으면 간단한 코드가 복잡해질 수 있습니다.

유연성 없음: Python이 인기를 끄는 이유 중 하나는 동적 특성과 유형 힌트가 이를 제한할 수 있다는 점입니다.

3. 기본 유형 팁

        Python의 모듈에는 Python 코드에 대한 유형 힌트를 제공하는 여러 함수와 클래스가 포함되어 있습니다. 다양한 시나리오에서 유형 힌트를 적용하는 방법은 다음과 같습니다.typing

       3.1 변수 유형 선언

        변수에 대한 유형 힌트를 제공하려면 콜론 기호와 유형을 차례로 사용할 수 있습니다. 예는 다음과 같습니다.:

age: int = 20
name: str = "Alice"
is_active: bool = True

        여기서 프롬프트는 정수, 문자열 및 부울 값입니다.agenameis_active

       3.2 함수 설명

        함수 매개변수 및 반환 값에 대해 유형 힌트를 제공할 수 있습니다. 이는 다른 개발자가 함수에 필요한 인수 유형과 함수가 반환하는 유형을 이해하는 데 도움이 됩니다.

def greet(name: str) -> str: \ return f"Hello, {name}"

이 예에서 함수는 문자열을 예상하고 문자열을 반환합니다. 

4. Python의 내장 유형

        Python에는 여러 내장 유형이 있습니다. 가장 일반적으로 사용되는 것은 다음과 같습니다.

  • int: 정수를 나타냄
  • float: 부동 소수점 숫자를 나타냅니다.
  • bool: 부울 값(true 또는 false)을 나타냅니다.
  • str: 문자열을 나타냅니다

        나중에 살펴보게 될 더 자세한 유형 힌트를 제공하는 데 사용할 수 있는 목록, 튜플, 사전과 같은 복합 유형도 있습니다.

부록 에서 Python의 주요 유형 목록을 찾을         수도 있습니다 .

4.1 원자형과 복합형

        Python에서는 유형 힌트 측면에서 원자 유형과 복합 유형이 구분됩니다. 원자 유형(예: , 및 )은 단순하고 분할할 수 없으며 해당 유형 주석은 유형 자체를 사용하여 직접 제공될 수 있습니다.intfloatstrstr

def my_function(my_string: str) -> int:
    return len(my_string)

        반면에 복합 유형은 다른 유형과 유사하며 Python 3.9 이전에는 유형 모듈에서 정수 목록과 같은 특정 정의를 가져와야 하는 경우가 많았습니다.ListDicttyping.List[int]

from typing import List

def my_function(numbers: List[int]) -> int:
    return sum(numbers)
 

최신 버전의 Python에서는 대신 쓸 수 있습니다.list[str]typing.List[int]

5. 함수 설명

        유형 힌트는 함수 서명에 통합될 때 특히 유용합니다. 이를 통해 개발자는 함수에 필요한 매개변수 유형을 이해할 수 있을 뿐만 아니라 함수가 반환할 내용도 이해할 수 있습니다.

5.1 함수의 매개변수 유형과 반환 유형을 지정하는 방법

        매개변수 기호와 반환 유형 기호를 사용하여 매개변수 유형과 함수의 반환 유형을 지정할 수 있습니다. 일반적인 구문은 다음과 같습니다.:->

def function_name(arg1: type1, arg2: type2, ...) -> return_type:
    # function body

        이 구문에서 , 등은 함수 매개변수이고, 등은 이러한 매개변수의 유형입니다. 함수가 반환하는 값의 유형입니다.arg1arg2type1type2return_type

5.2 함수 시그니처에 유형 힌트를 사용하는 예

        직사각형의 면적을 계산하는 함수를 고려해 보겠습니다.

def area_rectangle(length: float, breadth: float) -> float:
    return length * breadth
 

        이 함수에서는 부동 소수점 숫자가 예상되며 함수도 부동 소수점 숫자를 반환합니다. 부동 소수점 숫자로 변환할 수 있는 정수나 문자열을 전달하는 경우에도 함수는 계속 작동하지만 유형 힌트를 보면 이 함수가 부동 소수점 숫자를 처리하도록 설계되었음을 분명히 알 수 있습니다.lengthbreadth

        또 다른 예는 정수 목록을 받아들이고 그 합계를 정수로 반환하는 함수일 수 있습니다.

def sum_elements(numbers: list[int]) -> int:
    return sum(numbers)
 

        이 예에서 매개변수 프롬프트는 정수 목록이고 반환 유형은 정수입니다.numbers

        이러한 유형 힌트는 런타임 시 유형 검사를 시행하지 않습니다. 이는 실제 유형이 지정된 유형과 일치하지 않는 경우 Python이 a를 발생시키지 않는다는 개발자에게 힌트입니다.TypeError

6. 복잡한 유형

        Python의 유형 모듈은 보다 복잡한 유형 힌트를 제공하는 데 사용할 수 있는 여러 클래스를 제공합니다. 가장 일반적으로 사용되는 클래스는 다음과 같습니다.

6.1 리스트, 딕셔너리, 튜플, 세트

, 및 클래스를 사용하여 각각 목록, 사전, 튜플 및 집합에 대한 유형 힌트를 제공할 수 있습니다. 더 자세한 유형 힌트를 제공하기 위해 매개변수화할 수 있습니다.listdicttupleset

# A list of integers
numbers: list[int] = [1, 2, 3]

# A dictionary with string keys and float values
weights: dict[str, float] = {"apple": 0.182, "banana": 0.120}

# A tuple with an integer and a string
student: tuple[int, str] = (1, "John", "True")

# A set of strings
flags: set[str] = {"apple", "banana", "cherry"}
 

        이 예에서 힌트는 정수 목록, 문자열 키와 부동 소수점 값이 있는 사전, 정수와 문자열을 포함하는 튜플, 문자열 집합입니다.numbersweightsstudentflags

6.2 선택 사항

유형 힌트는 변수가 특정 유형 또는 .OptionalNone

from typing import Optional

def find_student(student_id: int) -> Optional[dict[str, str]]:
    # If the student is found, return a dictionary containing their data
    # If the student is not found, return None
 

6.3 연합

        유형 힌트는 변수가 여러 유형 중 하나일 수 있음을 나타내는 데 사용됩니다. 예를 들어 변수가 또는 일 수 있는 경우 다음과 같은 유형 힌트를 제공할 수 있습니다.Union[str,int]

from typing import Union

def process(data: Union[str, int]) -> None:
    # This function can handle either a string or an integer
 

        최신 버전의 Python에서는 파이프(|) 연산자를 사용하여 여러 옵션 중 하나가 될 수 있는 유형을 나타낼 수 있으므로 다음이 필요하지 않습니다.Union

def process(data: str | int) -> None:
    # This function can handle either a string or an integer
 

6.4 모두

        이 클래스는 변수가 모든 유형일 수 있음을 나타내는 데 사용됩니다. 이는 유형 힌트를 전혀 제공하지 않는 것과 같습니다.Any

from typing import Any

def process(data: Any) -> None:
    # This function can handle data of any type
 

        모듈의 이러한 도구를 사용하면 자세한 유형 힌트를 제공하여 코드를 더 쉽게 이해하고 디버그할 수 있습니다.typing

        그러나 Python의 유형 힌트는 선택 사항이며 런타임에 적용되지 않는다는 점을 명심하십시오. 이는 유형 안전성을 강화하기 위한 방법이 아니라 개발자 도구로 사용하기 위한 것입니다.

7가지 사용자 정의 유형

        Python에서는 사용자 정의 유형을 생성하기 위한 기본 메커니즘인 클래스를 사용하여 고유한 유형을 정의합니다. 이러한 클래스는 내장 유형과 마찬가지로 유형 힌트에 사용될 수 있습니다. 또한 이 모듈은 및 를 포함하여 보다 구체적인 유형을 생성하기 위한 다른 도구도 제공합니다.typingTypeNewType

7.1 클래스를 사용하여 자신만의 유형 정의

 클래스를 생성하여 유형 힌트로 사용할 수 있습니다. 예는 다음과 같습니다.

class Student:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

def print_student_details(student: Student) -> None:
    print(student.name, student.age)
 

   Student함수에서 유형 힌트로 사용되는 사용자 정의 유형입니다.print_student_details

7.2 유형 힌트Type

모듈의 클래스는 변수가 클래스의 인스턴스가 아니라 클래스임을 나타내는 데 사용될 수 있습니다. 이 메서드는 일반적으로 팩토리 함수와 같이 함수 매개변수가 클래스일 것으로 예상되는 경우에 사용됩니다.Typetyping

<span style="color:#3a3631"><span style="background-color:#faf9f7"><span style="background-color:#3a3631"><span style="color:#dad8d6"><code>from typing import Type

def create_student(cls: Type[Student], name: str, age: int) -> Student:
    return cls(name, age)
</code></span></span></span></span>

이 예에서 는 클래스(또는 그 하위 클래스)를 첫 번째 인수로 예상합니다.create_studentStudentStudent

7.3 다양한 유형 생성NewType

   NewType다양한 유형을 만드는 데 사용됩니다. 이는 동일한 두 가지 유형을 구별하려는 경우에 유용합니다.

        예를 들어, 프로그램에서 학생 ID와 강좌 ID를 다루고 있는데 이를 혼동하지 않으려고 한다고 가정해 보겠습니다. 둘 다 정수로 표시되므로 다음을 사용하여 두 가지 유형을 만들 수 있습니다.NewType

from typing import NewType

StudentID = NewType('StudentID', int)
CourseID = NewType('CourseID', int)

def get_student(student_id: StudentID) -> None:
    # Fetch student data...

def enroll_in_course(student_id: StudentID, course_id: CourseID) -> None:
    # Enroll the student in the course...
 

        및 은 둘 다 정수이지만 서로 다른 유형으로 간주되므로 서로 바꿔서 사용할 수 없습니다. 그러나 이 검사는 런타임에 적용되지 않고 .StudentIDCourseIDmypy

8. 제네릭

        제네릭을 사용하면 다양한 유형에 적용되는 함수, 클래스 또는 데이터 구조를 정의할 수 있습니다. 모듈의 클래스와 함수는 일반 유형을 정의하는 데 사용됩니다. 예를 들어 목록은 모든 유형의 요소를 포함할 수 있으므로 범용 데이터 구조입니다.GenericTypeVartyping

8.1 유형 변수

        TypeVar는 어떤 유형이든 될 수 있는 유형 변수를 정의하는 데 사용되며, 특정 유형은 클라이언트 코드에 의해 결정됩니다. 예는 다음과 같습니다.

from typing import TypeVar

T = TypeVar('T')

def first_element(lst: List[T]) -> T:
    return lst[0]
 

        여기에는 모든 유형이 될 수 있는 유형 변수가 있습니다. 이 함수는 모든 유형의 목록을 처리하고 해당 유형의 요소를 반환합니다. 특정 유형은 함수에 전달된 목록에 따라 결정됩니다.Tfirst_elementT

8.2 일반사항

Generic일반 클래스를 정의하는 데 사용됩니다. 일반 클래스는 클래스 내의 유형 힌트에 사용되는 여러 유형으로 초기화될 수 있습니다.

from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, value: T):
        self.value = value

    def get(self) -> T:
        return self.value

        다음은 모든 유형에 대해 작동하는 일반 클래스입니다. 인스턴스를 생성할 때 속성과 메서드에 사용될 유형을 지정할 수 있습니다.BoxTBoxTvalueget

box1 = Box[int](10)
box2 = Box[str]("Hello")
 

   box1는 정수를 포함하고 문자열을 포함합니다.Boxbox2Box

9. 유형 확인pyright

        이와 같은 유형 검사기는 Python에서 유형 힌트를 적용하는 도구입니다. Dagster에서는 다른 대안보다 빠르기 때문에 pyright를 정말 좋아합니다 .pyrightmypy

        Python 자체는 동적으로 유형이 지정되는 언어입니다. 즉, 유형 검사는 런타임에 발생하고 유형 힌트 규칙은 적용되지 않습니다. Python은 특정 데이터 유형에서 지원하지 않는 작업을 수행하려고 하면 런타임에 오류를 발생시킵니다. 예를 들어, 객체에 대해 정의되지 않은 메서드를 호출하면 런타임에만 오류가 발생합니다.

        그러나 규모가 크거나 복잡한 시스템을 개발할 때 유형 일관성을 적용하면 잠재적인 버그를 조기에 발견하는 데 도움이 될 수 있습니다. 정적 유형 검사를 수행합니다. 즉, 실제로 코드를 실행하기 전에 변수 유형, 함수 매개변수 및 반환 값을 확인합니다. 이는 코드에 제공한 유형 힌트를 사용하여 수행됩니다. 코드를 실행하거나 실행하는 것이 아니라 코드를 읽고 분석하기만 한다는 점을 이해하는 것이 중요합니다.pyrightpyright

9.1 유형 검사기를 사용하여 유형을 확인하는 방법

        사용하려면 먼저 설치해야 합니다.pyright

pip install pyright

        그런 다음 Python 파일을 검사하려면 파일을 인수로 실행합니다.pyright

pyright my_file.py 

        그런 다음 Pyright는 파일을 분석하고 발견된 모든 유형의 오류를 보고합니다.

        예를 들어, a를 매개변수로 받도록 주석이 달린 함수가 있고 stra를 전달하면 int이 매개변수가 캡처 pyright됩니다 .

9.2 정적 및 동적 유형 확인

        정적 유형 검사는 프로그램 텍스트(소스 코드) 분석을 기반으로 프로그램의 유형 안전성을 확인하는 프로세스입니다. 정적 유형 검사는 컴파일 타임(프로그램이 실행되기 전)에 수행됩니다. 정적 유형 검사를 시행하는 언어로는 C++, Java 및 Rust가 있습니다.

        반면 동적 유형 검사는 런타임 시 프로그램의 유형 안전성을 확인하는 프로세스입니다. 프로그램이 실행되는 동안 동적 유형 검사가 발생합니다. 동적 유형 검사를 사용하는 언어에는 Python, Ruby 및 JavaScript가 있습니다.

        정적 유형 검사에서는 프로그램이 실행되기 전에 유형을 검사하므로 유형 오류를 더 쉽게 포착하고 방지할 수 있습니다. 대부분의 유형 관련 오류가 컴파일 타임에 포착되므로 프로그램을 더 안전하게 실행할 수 있습니다. 그러나 프로그래머가 모든 변수와 함수 반환 값의 유형을 명시적으로 선언해야 하므로 유연성이 떨어지는 것으로 볼 수 있습니다.

        동적 유형 검사는 각 변수의 유형을 명시적으로 선언할 필요가 없기 때문에 더 많은 유연성을 제공합니다. 그러나 이는 런타임에 유형 오류가 발생하여 프로그램이 중단될 수 있음을 의미하기도 합니다.

        Python은 동적으로 유형이 지정되는 언어이지만 유형 힌트와 같은 도구를 통해 선택적 정적 유형 검사도 지원합니다. 이는 Python 프로그래머에게 고유한 유연성을 제공하여 정적 유형 검사의 안전성이 필요할 때와 동적 유형 지정의 유연성을 선호할 때를 선택할 수 있습니다.pyright

10. 힌트와 독스트링을 입력하세요

        앞서 논의한 것처럼 유형 힌트는 변수 유형, 함수 매개변수 및 반환 값을 나타냅니다. 이는 다른 개발자가 함수에서 예상하는 데이터 유형과 반환할 데이터 유형을 이해하는 데 도움이 됩니다.

        반면, 독스트링은 함수, 클래스 또는 모듈의 기능적 설명을 제공하는 데 사용됩니다. 독스트링에는 함수의 목적, 매개변수, 반환 값 및 발생할 수 있는 모든 예외에 대한 설명이 포함될 수 있습니다.

        다음은 유형 힌트와 독스트링을 함께 사용하는 방법에 대한 예입니다:

def filter_and_sort_products(products: list[dict[str, int]], attribute: str, min_value: int) -> list[dict[str, int]]:
    """
    Filters a list of products by a given attribute and minimum value, and then sorts the filtered products by the attribute.

    Args:
        products (list[dict[str, int]]): A list of products represented as dictionaries.
        attribute (str): The attribute to filter and sort by.
        min_value (int): The minimum acceptable value of the specified attribute.

    Returns:
        list[dict[str, int]]: A list of filtered and sorted products.

    Raises:
        KeyError: If the specified attribute is not found in any product.

    Examples:
        >>> products = [{"name": "Apple", "price": 10}, {"name": "Banana", "price": 5}]
        >>> filter_and_sort_products(products, "price", 6)
        [{"name": "Apple", "price": 10}]
    """
    filtered_products = [product for product in products if product[attribute] >= min_value]
    return sorted(filtered_products, key=lambda x: x[attribute])

        여기서 함수 시그니처는 함수가 제품을 나타내는 사전 목록, 속성을 나타내는 문자열 및 최소값을 나타내는 정수를 취함을 보여줍니다. 필터링되고 정렬된 사전 목록을 반환합니다.

        문서 문자열은 함수의 목적, 매개변수, 반환 값, 가능한 예외(예: 특정 속성이 존재하지 않는 경우)를 설명하고 함수 호출 방법에 대한 예를 포함합니다.KeyError

        이러한 유형 힌트와 독스트링의 조합은 코드의 가독성과 유지 관리성을 크게 향상시킬 수 있습니다.

11. 결론

        Python 프로그래밍 모범 사례를 기반으로 유형 힌트가 코드 가독성과 유지 관리성을 어떻게 향상시킬 수 있는지 살펴봅니다.

        질문이 있거나 추가 설명이 필요한 경우 언제든지 Dagster Slack에 가입하여 커뮤니티에 도움을 요청하세요. 읽어 주셔서 감사합니다!

Supongo que te gusta

Origin blog.csdn.net/gongdiwudu/article/details/132761470
Recomendado
Clasificación