Python에서 더 리터럴이 되는 방법

이제 Pythons Literals에 대해 이야기할 시간입니다. 말 그대로 😄.



이제 우리는 그 재미없는 농담을 제거했습니다.

리터럴이란 무엇이며 왜 유용한가요?



기본 동기는 함수가 특정 값 집합만 취할 수 있는 인수를 가질 수 있고 해당 함수가 해당 입력에 따라 값/유형 변경을 반환한다는 것입니다. 일반적인 예는 다음과 같습니다(자세히 찾을 수 있음here).
  • pandas.concat 또는 pandas.DataFrame 반환할 수 있는pandas.Series
  • pandas.to_datetime , datetime.datetime , DatetimeIndex , Series ...
  • 를 반환할 수 있는 DataFrame
    반환 값이 어떤 유형인지 알 수 없다면 문제가 될 것입니다. 리터럴은 식에 특정 값만 있음을 나타내는 데 도움이 될 수 있습니다. 이를 오버로딩과 결합하면 해당 유형의 함수에 유형 힌트를 추가할 수 있습니다. 하지만 반환 유형을 변경하는 예제를 살펴보기 전에 간단한 것부터 시작하겠습니다.

    from typing import Literal
    
    a: Literal[5] = 5
    


    유형 검사기는 a가 항상 int 5여야 한다는 것을 알고 이를 변경하려고 하면 경고를 표시합니다.



    더 많은 예



    입력 값에 따라 리턴 타입이 달라지는 함수를 정의해 봅시다. 하지만 리터럴과 오버로딩 없이 그렇게 해봅시다:

    def fun(param):
        if param == "all":
            return "all"
        elif param == "number":
            return 1 
    


    이 함수는 인수 param를 사용하고 all 또는 숫자 1을 반환합니다. 이 함수의 반환 유형은 Literal["all", 1] 이지만 이렇게 하려고 하면 다음과 같습니다.

    b = fun("number")
    b + 1
    


    다음과 같은 경고가 표시됩니다.

    이것에 대해:

    b = fun("all")
    b  + "all"
    




    유형 검사기는 해당 함수의 반환 유형이 무엇인지 모릅니다. 오버로드를 통해 그를 도울 수 있습니다.

    과부하



    Python에서 오버로딩을 사용하면 입력 및 출력 유형의 여러 조합이 있는 함수를 설명할 수 있습니다(정의는 하나만 있음). 다음과 같이 overload 데코레이터를 사용하여 함수를 오버로드할 수 있습니다.

    from typing import overload
    
    @overload
    def f(a: int) -> int:
       ...
    @overload
    def f(a: str) -> str:
       ...
    def f(a):
       <implementation of f>
    


    먼저 함수를 만들고 그 위에 함수를 만듭니다. 그런 다음 @overload 데코레이터가 있는 일련의 함수를 추가합니다. 이 함수는 반환 유형을 추측하는 데 도움이 됩니다.

    이제 리터럴로 돌아갑니다. 기능 수정 방법fun ? 쉬움 - 오버로드합니다(확인을 위해 유형 힌트 추가).

    @overload
    def fun(param: Literal["all"]) -> Literal["all"]:
        ...
    @overload
    def fun(param: Literal["number"]) -> int:
        ...
    def fun(param: Literal["all", "number"]) -> Literal["all"] | int:
        if param == "all":
            return "all"
        elif param == "number":
            return 1
    


    보시다시피 이 기능이 커졌지만 이제 다음과 같이 할 수 있습니다.

    b = fun("number")
    c = b + 1
    




    경고없이 😎. 반환 유형이 변경되면 경고하십시오.

    b = fun("all")
    c = b + 1
    




    참조


  • PEP 586 - Literal Types
  • typing#overload
  • 좋은 웹페이지 즐겨찾기