> 백엔드 개발 > 파이썬 튜토리얼 > Python의 점진적인 타이핑: 코드 안전성과 성능을 유연하게 향상

Python의 점진적인 타이핑: 코드 안전성과 성능을 유연하게 향상

Barbara Streisand
풀어 주다: 2024-11-27 18:29:15
원래의
338명이 탐색했습니다.

Python

Python의 점진적인 타이핑은 동적 유연성과 정적 안전성이라는 두 가지 장점을 모두 원하는 개발자에게 획기적인 변화를 가져옵니다. 그것은 측면을 선택하는 것이 아닙니다. 그것은 우리 프로젝트에 가장 적합한 지점을 찾는 것입니다.

기본부터 시작하겠습니다. Python은 항상 동적으로 유형이 지정되었습니다. 즉, 변수 유형을 선언할 필요가 없습니다. 이는 우리에게 놀라운 유연성을 제공하지만 포착하기 어려운 런타임 오류로 이어질 수도 있습니다. 점진적인 타이핑이 필요한 곳입니다.

점진적 입력을 통해 코드에 유형 힌트를 추가할 수 있습니다. 이러한 힌트는 선택 사항이므로 기존 코드를 손상시키지 않고 점차적으로(그래서 이름이 붙었습니다) 도입할 수 있습니다. 다음은 간단한 예입니다.

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

print(greet("Alice"))  # Output: Hello, Alice!
print(greet(42))  # This will run, but a type checker would warn us
로그인 후 복사
로그인 후 복사

이 예에서는 이름이 문자열이어야 하고 함수가 문자열을 반환해야 한다고 Python에 지시합니다. 그러나 Python은 런타임에 이를 강제하지 않습니다. 잠재적인 문제를 파악하기 위해 mypy와 같은 유형 검사기를 사용하는 것은 우리에게 달려 있습니다.

이제 좀 더 자세히 살펴보겠습니다. 점진적 입력의 멋진 점 중 하나는 입력된 코드와 입력되지 않은 코드를 혼합할 수 있다는 것입니다. 이는 유형 힌트를 사용하지 않는 레거시 코드베이스나 타사 라이브러리로 작업할 때 매우 유용합니다.

def process_data(data: list[int]) -> int:
    return sum(data)

# This function doesn't use type hints
def get_data():
    return [1, 2, 3, 4, 5]

result = process_data(get_data())  # This works fine
로그인 후 복사

여기서 process_data는 유형 힌트를 사용하지만 get_data는 사용하지 않습니다. 여전히 원활하게 함께 작업할 수 있습니다.

그러나 점진적인 타이핑은 단지 여기 저기에 int를 추가하는 것이 아닙니다. 그것은 완전히 새로운 가능성의 세계를 열어줍니다. 예를 들어, 사용자 정의 유형을 생성하여 코드를 더욱 표현력 있게 만들 수 있습니다.

from typing import NewType

UserId = NewType('UserId', int)

def get_user_info(user_id: UserId) -> dict:
    # Fetch user info from database
    pass

user_id = UserId(12345)
info = get_user_info(user_id)  # This is fine
info = get_user_info(12345)  # A type checker would warn about this
로그인 후 복사

이것은 논리적 오류를 잡는 데 도움이 됩니다. 물론, 사용자 ID는 정수일 수 있지만 모든 정수가 유효한 사용자 ID는 아닙니다.

이제 좀 더 발전된 개념에 대해 이야기해 보겠습니다. 공분산(Covariance)과 반공변성(Contravariance)은 유형 힌트에서 하위 유형과 상위 유형을 사용하는 방법을 설명하는 멋진 용어입니다. 처음에는 다소 당황스럽겠지만 매우 유용합니다.

from typing import List, Callable

class Animal:
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "Woof!"

def animal_sounds(animals: List[Animal]) -> List[str]:
    return [animal.make_sound() for animal in animals]

dogs: List[Dog] = [Dog(), Dog()]
sounds = animal_sounds(dogs)  # This is fine because Dog is a subtype of Animal
로그인 후 복사

이 예에서는 공분산을 사용합니다. Dog는 Animal의 하위 유형이므로 Animal 목록을 기대하는 함수에 Dogs 목록을 전달할 수 있습니다.

반공변성은 그 반대입니다. 함수 인수를 처리할 때 유용합니다.

def feed_animal(animal: Animal):
    print("Feeding animal")

def feed_dog(dog: Dog):
    print("Feeding dog")

def do_feeding(feeder: Callable[[Animal], None], animal: Animal):
    feeder(animal)

do_feeding(feed_animal, Dog())  # This is fine
do_feeding(feed_dog, Animal())  # A type checker would warn about this
로그인 후 복사

여기서는 개를 포함한 모든 동물을 처리할 수 있으므로 Feed_animal을 do_feeding에 전달할 수 있습니다. 하지만 Feed_dog은 모든 유형의 동물을 처리할 수 없기 때문에 전달할 수 없습니다.

이러한 개념은 다소 추상적으로 보일 수 있지만 복잡한 시스템을 설계할 때 매우 강력합니다.

이제 대규모 Python 코드베이스에 정적 타이핑을 점진적으로 도입할 수 있는 방법에 대해 이야기해 보겠습니다. 그것은 전부 아니면 전무한 제안이 아닙니다. 작게 시작하여 성장할 수 있습니다.

먼저 공개 API에 유형 힌트를 추가할 수 있습니다. 이는 코드 사용자가 전달해야 하는 유형과 반환되는 내용을 이해하는 데 도움이 됩니다. 그런 다음 유형 관련 버그가 특히 문제가 될 수 있는 코드의 중요한 섹션으로 이동할 수 있습니다.

더 많은 유형 힌트를 추가하면 이점이 나타나기 시작할 것입니다. 유형 검사기는 코드를 실행하기도 전에 잠재적인 버그를 찾아낼 수 있습니다. 우리 IDE는 더 나은 자동 완성 및 리팩토링 지원을 제공할 수 있습니다. 그리고 우리 코드는 어느 정도 자체 문서화됩니다.

하지만 균형을 유지해야 합니다. 우리는 유형 힌트를 과도하게 사용하여 Python을 훌륭하게 만드는 가독성과 단순성을 잃고 싶지 않습니다. 때로는 특히 간단하고 자명한 코드의 경우 유형을 지정하지 않은 상태로 두어도 괜찮습니다.

점진적으로 함수를 입력하는 예를 살펴보겠습니다.

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

print(greet("Alice"))  # Output: Hello, Alice!
print(greet(42))  # This will run, but a type checker would warn us
로그인 후 복사
로그인 후 복사

유형 힌트 없이 시작한 다음 몇 가지 기본 힌트를 추가하고 마침내 완전한 유형의 버전을 위한 사용자 정의 유형을 만들었습니다. 각 단계는 기능을 변경하지 않고도 코드의 견고성을 향상시킵니다.

점진적 타이핑의 가장 멋진 점 중 하나는 성능 향상으로 이어질 수 있다는 것입니다. 유형 정보를 제공하면 Python이 때때로 코드를 최적화할 수 있습니다. 예를 들어, 보다 효율적인 데이터 구조를 사용하거나 불필요한 유형 검사를 피할 수 있습니다.

그러나 점진적인 타이핑의 가장 큰 이점은 코드에 대한 생각이 바뀌는 방식일 것입니다. 유형을 고려하기 시작할 때 이전에 생각하지 못했던 논리적 불일치나 잠재적인 극단적 사례를 발견하는 경우가 많습니다. 이는 우리 코드가 무엇을 해야 할지에 대해 미래의 자신과 대화를 나누는 것과 같습니다.

물론 점진적인 타이핑에 어려움이 없는 것은 아닙니다. 코드를 더 장황하게 만들 수 있으며 유형 힌트를 효과적으로 사용하려면 학습 곡선이 필요합니다. 또한 유형 힌트가 정확성을 보장한다고 생각하는 함정에 빠지지 않도록 주의해야 합니다. 유형 힌트는 특정 종류의 오류를 파악하는 데 도움이 되는 도구이지만 만병통치약은 아닙니다.

마무리하면서 Python에서 점진적인 입력을 사용하는 몇 가지 모범 사례를 고려해 보겠습니다.

  1. 코드베이스의 중요한 부분부터 시작하세요. 유형 관련 버그가 가장 문제가 되는 영역에 집중하세요.

  2. mypy와 같은 유형 검사기를 정기적으로 사용하세요. 이는 유형 관련 문제에 대한 첫 번째 방어선입니다.

  3. 모든 것을 입력해야 한다는 의무감을 느끼지 마세요. 때로는 동적 타이핑이 꼭 필요한 경우도 있습니다.

  4. MonkeyType과 같은 도구를 사용하여 기존 코드에 대한 유형 힌트를 자동으로 생성하세요.

  5. 유형 힌트는 기계뿐 아니라 인간에게도 적용된다는 점을 기억하세요. 일종의 문서입니다.

  6. Python의 입력 기능에 대한 최신 정보를 받아보세요. 끊임없이 발전하고 개선되고 있습니다.

Python의 점진적 타이핑은 정적 타이핑과 동적 타이핑의 이점을 모두 활용할 수 있는 강력한 도구입니다. 이는 Python으로 할 수 있는 작업을 제한하는 것이 아니라 강력하고 유지 관리 가능한 코드를 작성할 수 있는 더 많은 옵션과 도구를 제공하는 것입니다. 모든 도구와 마찬가지로 중요한 것은 도구를 효과적으로 사용하는 시기와 방법을 배우는 것입니다. 그러니 계속해서 입력하세요 – 점차적으로!


우리의 창조물

저희 창작물을 꼭 확인해 보세요.

인베스터 센트럴 | 스마트리빙 | 시대와 메아리 | 수수께끼의 미스터리 | 힌두트바 | 엘리트 개발자 | JS 학교


우리는 중간에 있습니다

테크 코알라 인사이트 | Epochs & Echoes World | 투자자중앙매체 | 수수께끼 미스터리 매체 | 과학과 신기원 매체 | 현대 힌두트바

위 내용은 Python의 점진적인 타이핑: 코드 안전성과 성능을 유연하게 향상의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿