나는 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)
False
None, 0, [], “”등과 같이 Python이 고려하는 값을 제공 할 때 0을 사용합니다 . 0은이므로 False
대체 값으로 0 만 사용해야합니다 (그렇지 않으면 0을 찾을 수 있습니다. 그 값으로 전환).
int(0 if value is None else value)
이것은 None
0으로 만 대체됩니다. 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
하는 것이 아니라 예상대로 숫자 대신 어디서 / 왜 얻고 있는지 파악하고 수정하거나 올바르게 처리하는 것입니다.int
str
None
None
답변
Python 3에서는 “or”키워드도 사용할 수 있습니다. 이 방법:
foo = bar or 0
foo2 = bar or ""
답변
이 유형의 오류에 대해 int (x 또는 0)를 성공적으로 사용했지만 None이 논리에서 0과 같아야합니다. x 테스트가 False를 반환하는 다른 경우에도이 값이 0으로 확인됩니다. 예 : 빈 목록, 세트, 사전 또는 길이가 0 인 문자열. 죄송합니다. Kindall이 이미이 답변을주었습니다.
답변
이것은 함수에서 값을 반환하는 것을 잊은 경우 발생할 수 있습니다. 그런 다음 None을 반환합니다. 해당 변수에 할당하는 모든 위치를 살펴보고 그중 하나가 함수에 return 문이없는 함수 호출인지 확인합니다.