Python에서 더 리터럴이 되는 방법
8454 단어 tutorialprogrammingpython
이제 우리는 그 재미없는 농담을 제거했습니다.
리터럴이란 무엇이며 왜 유용한가요?
기본 동기는 함수가 특정 값 집합만 취할 수 있는 인수를 가질 수 있고 해당 함수가 해당 입력에 따라 값/유형 변경을 반환한다는 것입니다. 일반적인 예는 다음과 같습니다(자세히 찾을 수 있음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
참조
Reference
이 문제에 관하여(Python에서 더 리터럴이 되는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/finloop/how-to-be-more-literal-in-python-2ebc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)