예외가 있는 Python 유형 암시
다음과 같은 기능이 있습니다.
def check_for_errors(result):
if 'success' in result:
return True
if 'error' in result:
raise TypeError
return False
이 기능을 성공적으로 실행하면 다음과 같은 정보를 얻을 수 있습니다.bool
하지만 만약 오류가 있다면, 나는 그것을 받아야 합니다.TypeError
다른 기능으로 처리하기 때문에 괜찮습니다.
제 기능의 첫 줄은 다음과 같습니다.
def check_for_errors(result: str) -> bool:
제 질문은: 제 타입 암시의 오류를 언급해야 할까요?
유형 암시는 예외에 대해 아무 말도 할 수 없습니다.기능의 범위를 완전히 벗어났습니다.그러나 문서 문자열에서 예외를 계속 문서화할 수 있습니다.
예외
명시적으로 제기된 예외를 나열하기 위한 구문이 제안되지 않았습니다.현재 이 기능에 대해 알려진 유일한 사용 사례는 문서이며, 이 경우 이 정보를 문서 문자열에 입력하는 것이 좋습니다.
Guido van Rossum은 각 수준에서 예외를 확인하거나 명시적으로 선언해야 하는 상황에 빠지는 것을 원하지 않기 때문에 유형 암시 사양에 예외를 추가하는 것에 강하게 반대했습니다.
일반적으로 오류를 기록하는 것이 좋습니다.이는 사용자의 기능을 사용하는 다른 개발자가 사용자의 코드를 읽지 않고도 오류를 처리할 수 있음을 의미합니다.
예외 경로를 최소한 특정 시나리오에서 함수 유형 주석의 일부로 만드는 데는 충분한 이유가 있습니다.단지 호출자가 어떤 예외를 처리해야 하는지 이해해야 할 때마다 타이프 체커에서 더 많은 도움을 제공할 뿐입니다. (자세한 분석에 관심이 있으시다면, 이에 대한 블로그 게시물을 작성했습니다.)
함수가 발생시키는 예외(예: Java)를 나타내는 것은 Python 타이핑 시스템의 범위를 벗어났기 때문에 이를 얻기 위한 해결책이 필요합니다.올리는 대신에, 우리는return
예외 사항그런 식으로 예외는 함수 서명의 일부가 되고 호출자는 유형 검사기의 힘을 활용하여 예외를 처리해야 합니다.
다음 코드는 러스트에서 예외 처리가 수행되는 방식에서 영감을 받았습니다.다음을 제공합니다.Result
둘 중 하나일 수 있는 유형Ok
또는Err
.둘다요.Ok
그리고.Err
수업이 있습니다.unwrap()
함수 - 래핑된 값을 반환하거나 래핑된 예외를 발생시킵니다.
from typing import Generic, TypeVar, NoReturn
OkType = TypeVar("OkType")
ErrType = TypeVar("ErrType", bound=Exception)
class Ok(Generic[OkType]):
def __init__(self, value: OkType) -> None:
self._value = value
def unwrap(self) -> OkType:
return self._value
class Err(Generic[ErrType]):
def __init__(self, exception: ErrType) -> None:
self._exception = exception
def unwrap(self) -> NoReturn:
raise self._exception
Result = Ok[OkType] | Err[ErrType]
Result
입니다.Generic
두 : 그고그두 을: 리것은지.Ok
의 유형인 고종류리그▁value.Err
들어 과 같습니다.다음은 예제에 적용됩니다.
def check_for_errors(result: list[str]) -> Result[bool, TypeError]:
if 'success' in result:
return Ok(True)
if 'error' in result:
return Err(TypeError())
return Ok(False)
def careful_method(result: list[str]):
r = check_for_errors(result)
# Now, typechecker knows that r is `Result[bool, TypeError]`
if isinstance(r, Err):
# implement the error handling
else:
# implement the happy path
# If you do not want to handle the exception at this stage
def careless_method(result: list[str]):
check_for_errors(result).unwrap()
이것은 원리를 설명하기 위한 대략적인 코드 스케치일 뿐입니다.이 접근법을 따르는 것을 고려한다면, 제가 추천하는 좀 더 정교한 도서관인 폴터가이스트가 있습니다.
can In, Python 서수할다있니습에▁in.raise
a TypeError
키워드 raise를 하는 메서드
def my_function(v1, v2):
if not isinstance(v1, str):
print('v1 must be str') OR raise TypeError('type message here')
if not isinstance(v2, int):
print('v2 must be int')
my_function('1',1)
넌 할 수 있다.raise TypeError
.
언급URL : https://stackoverflow.com/questions/44282268/python-type-hinting-with-exceptions
'programing' 카테고리의 다른 글
postgresql로 "무시 삽입" 및 "중복 키 업데이트 시"(sql 병합)를 에뮬레이트하는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
"모호한 리디렉션" 오류를 가져오는 중 (0) | 2023.05.07 |
VBA의 멀티스레딩 (0) | 2023.05.07 |
.translate()를 사용하여 Python 3.x의 문자열에서 구두점을 제거하는 방법은 무엇입니까? (0) | 2023.05.07 |
날짜 범위 간의 postgresql 쿼리 (0) | 2023.05.07 |