None을 반환하는 함수에 대한 TypeChecking
Aug 23 2020
계승 함수의 재귀 구현을 고려하십시오.
from typing import Optional
def factorial(val: int) -> Optional[int]:
if val<0:
return None
if val==0:
return 1
return val*factorial(val-1)
if __name__ == "__main__":
print(square_root(3))
mypy정적 유형 검사에 사용 하고 있습니다. 다음 오류가 발생합니다.
type-hints.py:8: error: Unsupported operand types for * ("int" and "None")
type-hints.py:8: note: Right operand is of type "Optional[int]"
Found 1 error in 1 file (checked 1 source file)
이 stackoverflow 질문에 Optional따라 사용해 보았습니다 . 그러나 작동하지 않는 것 같습니다. 어떤 제안?
질문 -
- 함수가 반환 될 때 반환 유형을 지정하는 방법은
None무엇입니까? - 조금 나에게 놀랄 것 같다 mypy이 곳 곱셈 사이에 상황 구상 할 수 있었다
int및None발생할 수 있습니다. 예를 들어 - 나는 제거하는 경우int에 대한 발의 인수 및 부동 소수점으로 계승 함수를 호출, 그러한 오류가 발생 할 수 있습니다.
답변
2 MisterMiyagi Aug 23 2020 at 03:01
MyPy는 함수가 잘 입력되지 않은 것이 맞습니다. 함수의 시그니처가 (int) -> Optional[int]이므로 오류가 val*factorial(val-1) 발생할 수 있습니다 . 이는 정적 유형 정보 가 아닌None 경우에만 발생합니다 .val < 0
None잘못된 입력 을 반환 하는 대신 예외를 발생시킵니다. 이렇게하면 오류 처리를 제거하지 않고도 함수를 정적으로 잘 형식화 할 수 있습니다.
def factorial(val: int) -> int:
if val<0:
raise ValueError("factorial() not defined for negative values")
if val==0:
return 1
return val*factorial(val-1)
None어떤 이유로 반환 이 필요한 경우 표현식이 건전하며 검사 할 필요가 없음을 명시 적으로 주석 처리합니다.
def factorial(val: int) -> int:
if val<0:
return None
if val==0:
return 1
return val*factorial(val-1) # type: ignore