[python] Nonetype을 정수 또는 문자열로 변환하는 방법은 무엇입니까?

나는 Nonetype값을 가지고 있으며 x일반적으로 숫자이지만 None. 나는 그것을 숫자로 나누고 싶지만 Python은 다음을 발생시킵니다.

TypeError: int() argument must be a string or a number, not 'NoneType'

어떻게 해결할 수 있습니까?



답변

댓글 중 하나에서 다음과 같이 말합니다.

어떻게 든 나는 Nonetype 값을 얻었습니다. 그것은 int이어야하지만 이제는 Nonetype 객체입니다.

그것이 당신의 코드라면, 당신이 None숫자를 기대할 때 어떻게 얻고 있는지 파악하고 일이 발생 하지 않도록하십시오.

다른 사람의 코드 인 None경우 일반적인 조건부 코드를 사용하여 해당 코드가 제공하는 조건을 찾고이를 위해 사용할 합리적인 값을 결정합니다.

result = could_return_none(x)

if result is None:
    result = DEFAULT_VALUE

…또는…

if x == THING_THAT_RESULTS_IN_NONE:
    result = DEFAULT_VALUE
else:
    result = could_return_none(x) # But it won't return None, because we've restricted the domain.

0여기서 자동으로 사용할 이유는 없습니다 . “거짓”에 의존하는 솔루션은 None이를 원할 것이라고 가정합니다. 는 DEFAULT_VALUE(심지어 존재하는 경우) 완전 코드의 목적에 따라 달라집니다.


답변

int(value or 0)

FalseNone, 0, [], “”등과 같이 Python이 고려하는 값을 제공 할 때 0을 사용합니다 . 0은이므로 False대체 값으로 0 만 사용해야합니다 (그렇지 않으면 0을 찾을 수 있습니다. 그 값으로 전환).

int(0 if value is None else value)

이것은 None0으로 만 대체됩니다. None특별히 테스트 중이므로 다른 값을 대체로 사용할 수 있습니다.


답변

이러한 상황을 처리하는 일반적인 “Pythonic”방법은 EAFP 로 알려져 있습니다. ” 허가보다 용서를 구하는 것이 더 쉽습니다 .” 일반적으로 모든 것이 정상이라고 가정하는 코드를 작성 try..except하고 그렇지 않은 경우 처리 할 수 ​​있도록 블록으로 래핑하는 것을 의미합니다 .

문제에 적용된 코딩 스타일은 다음과 같습니다.

try:
    my_value = int(my_value)
except TypeError:
    my_value = 0  # or whatever you want to do

answer = my_value / divisor

또는 더 간단하고 약간 더 빠릅니다.

try:
    answer = int(my_value) / divisor
except TypeError:
    answer = 0

역전적이고 더 전통적인 접근 방식은 LBYL 로 알려져 있습니다. LBYL 은 ” 도약하기 전에보기 “를 의미합니다. @Soviut와 다른 일부가 제안한 것입니다. 이 주제에 대한 추가 내용은 이 사이트의 다른 곳 에서 키가 사전에 있는지 확인 하는 질문에 대한 내 답변 및 관련 의견을 참조하십시오 .

EAFP의 잠재적 인 문제 중 하나 는 사용중인 코드 또는 타사 모듈의 다른 부분에 문제가 있다는 사실을 숨길 수 있다는 것입니다. 특히 예외가 자주 발생하므로 실제로 “예외적 인”경우가 아닙니다. 조금도).


답변

그것은 TypeError통과하려고 할 때만 나타납니다 int() None( NoneType내가 아는 한 유일한 가치입니다). 실제 목표는 또는 로 변환 NoneType하는 것이 아니라 예상대로 숫자 대신 어디서 / 왜 얻고 있는지 파악하고 수정하거나 올바르게 처리하는 것입니다.intstrNoneNone


답변

Python 3에서는 “or”키워드도 사용할 수 있습니다. 이 방법:

foo = bar or 0
foo2 = bar or ""


답변

이 유형의 오류에 대해 int (x 또는 0)를 성공적으로 사용했지만 None이 논리에서 0과 같아야합니다. x 테스트가 False를 반환하는 다른 경우에도이 값이 0으로 확인됩니다. 예 : 빈 목록, 세트, ​​사전 또는 길이가 0 인 문자열. 죄송합니다. Kindall이 이미이 답변을주었습니다.


답변

이것은 함수에서 값을 반환하는 것을 잊은 경우 발생할 수 있습니다. 그런 다음 None을 반환합니다. 해당 변수에 할당하는 모든 위치를 살펴보고 그중 하나가 함수에 return 문이없는 함수 호출인지 확인합니다.