>백엔드 개발 >파이썬 튜토리얼 >Python에서 함수에 주석 달기

Python에서 함수에 주석 달기

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-27 20:36:11745검색

Annotating Functions in Python

최근에 Typescript의 주석 기능에 대한 블로그를 게시했습니다. 방금 약간의 연구를 마쳤고 Python에서 함수에 주석을 추가하는 방법에 대해 더 많이 이해했습니다. 이번 블로그에서는 지난 블로그

와 유사한 예제를 사용하여 Python 함수에 주석을 추가하는 방법을 다룰 예정입니다.

python.analytic.typeCheckingMode를 기본, 표준, 엄격 중 하나로 설정하여 Visual Studio Code에서 유형 주석의 유효성을 검사할 수 있습니다. 기본 및 표준 옵션을 사용한다고 해서 반드시 함수와 변수에 주석을 다는 것은 아니지만 엄격한 옵션은 주석을 다는 것을 보장합니다.

기능 값

이것은 충격을 줄 수 있습니다. 그러나 Python에서는 함수를 반환하고 함수를 값으로 전달할 수 있습니다. 콜백 함수는 실제로 다음과 같이 작성된 Callable 유형을 사용하여 주석이 추가됩니다.

Callable[[argtype1, argtype2, argtype3], returnType]

예를 들어, length(text: str) -> int는 Callable[[str], int]

로 주석이 추가됩니다.

예를 들어

JavaScript의 이 기능

function multiplier(factor){
    return value => factor * value
}

const n = multiplier(6)
n(8) // 48

파이썬에서는 이렇게 작성할 수 있습니다

def multiplier(factor):
    def inner(value):
        return value * factor
    return inner     

n = multiplier(6)
n(8) #48

다음과 같이 문자 그대로 int와 float의 합집합인 number라는 TypeAlias를 만들 수 있습니다.

from typing import TypeAlias, Union

number: TypeAlias = Union[int, float]

매개변수를 자바스크립트 숫자로 접근합니다.

따라서 이 함수에 주석을 달기 위해

def multiplier(factor: number) -> Callable[[number], number]:
    def inner(value: number) -> inner:
        return value * factor
    return inner

a = multiplier(4.5)
a(3) #13.5

일반 함수

고전적인 일반 함수 예는

def pick(array, index):
    return array[index]

pick([1,2,3], 2) #3

TypeVar를 사용하면 이제 일반적인 장황한 내용을 생성할 수 있습니다(typescript보다 더 장황한).

from typing import TypeVar

T = TypeVar("T") # the argument and the name of the variable should be the same

그래서

from typing import TypeVar, Sequence

def pick(array: Sequence[T], index: int) -> T:
    return array[index]

print(pick([1,2,3,4], 2))

그렇다면 JavaScript에서 지도처럼 작동하는 사용자 정의 myMap 함수는 어떻습니까?

기억하세요: Python의 map()은 List 유형이 아닌 Iterable 유형을 반환합니다

def myMap(array, fn):
    return map(fn, array)

def twice(n): return n * 2
print(myMap([1,2,3], twice))

이 함수에 주석을 달기 위해 Callable 유형과 TypeVar 유형을 혼합하여 사용할 수 있습니다. 관찰...

from typing import TypeVar, Iterable, Callable

Input = TypeVar("Input")  # Input and "Input" must be the same
Output = TypeVar("Output")

def myMap(array: Iterable[Input], fn: Callable[[Input], Output]) -> Iterable[Output]:
    return map(fn, array)

def twice(n: int) -> int: return n * 2
print(myMap([1,2,3], twice))

또는 Callable 함수에 별칭을 지정할 수 있습니다

from typing import TypeVar, Iterable, Callable

Input = TypeVar("Input")
Output = TypeVar("Output")

MappableFunction = Callable[[Input], Output]

def myMap(array: Iterable[Input], fn: MappableFunction[Input, Output]) -> Iterable[Output]:
    return map(fn, array)

MappableFunction은 이러한 일반 유형 입력 및 출력을 가져와 Callable[[Input], Output]의 컨텍스트에 적용합니다.

myFilter 함수에 어떻게 주석이 추가될지 잠시 생각해 보세요.

이런 생각을 했다면

from typing import Iterable, TypeVar, Callable

Input = TypeVar("Input")

def myFilter(array: Iterable[Input], fn: Callable[[Input], bool]) -> Iterable[Input]:
    return filter(fn, array)

당신 말이 맞아요

일반 클래스

클래스 주석에 대해 이야기해서는 안 되지만 일반 클래스에 대해 설명할 시간을 좀 주세요.

Typescript-verse에서 왔다면 이렇게 정의했을 것입니다

class GenericStore<Type>{
    stores: Array<Type> = []

    constructor(){
        this.stores = []
    }

    add(item: Type){
        this.stores.push(item)
    }
}

const g1 = new GenericStore<string>(); //g1.stores: Array<string>
g1.add("Hello") //only string are allowed

그러나 Python에서는 다소 다르고 어색합니다.

  • 먼저 Generic 유형을 가져온 다음 이를 Generic 클래스의 하위로 만듭니다

이 GenericStore 클래스를 Python으로 다시 생성하려면

Callable[[argtype1, argtype2, argtype3], returnType]

Python에서 함수에 주석을 추가하는 방법을 배워야 하는 이유는 무엇입니까?

이전 블로그에서 말했듯이 이는 훨씬 더 스마트한 유형 시스템을 구축하는 데 도움이 되며 결과적으로 버그 발생 가능성을 줄여줍니다(특히 mypy와 같은 정적 파일 검사기를 사용할 때). 또한 강력한 유형 시스템을 사용하여 라이브러리(또는 SDK)를 작성할 때 라이브러리를 사용하는 개발자의 생산성을 약간 향상시킬 수 있습니다(주로 편집기 제안으로 인해)

궁금한 점이나 이 글에 틀린 부분이 있으면 댓글로 남겨주세요⭐

위 내용은 Python에서 함수에 주석 달기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.