나는 Nonetype값을 가지고 있으며 x일반적으로 숫자이지만 None. 나는 그것을 숫자로 나누고 싶지만 Python은 다음을 발생시킵니다.
TypeError: int() argument must be a string or a number, not 'NoneType'
어떻게 해결할 수 있습니까?
나는 Nonetype값을 가지고 있으며 x일반적으로 숫자이지만 None. 나는 그것을 숫자로 나누고 싶지만 Python은 다음을 발생시킵니다.
TypeError: int() argument must be a string or a number, not 'NoneType'
어떻게 해결할 수 있습니까?
int(None)None을 int로 변환 할 수 없기 때문에 예외가 발생합니다. 귀하의 질문에 대한 대답은 할 수 없다는 것입니다. 0, 2771 또는 분홍 코끼리와 같은 것을 대체 할 수 있지만 대체하는 것이 무엇이든 여전히 None을 int로 변환 할 수 없습니다.
None분홍 코끼리로 숫자 나누기를 공식적으로 정의하는 숫자 체계를 사용하지 않는 한 분홍 코끼리 로 변환 하는 것도 좋지 않습니다 (그리고이를 백업하는 코드를 작성했습니다)
답변:
댓글 중 하나에서 다음과 같이 말합니다.
어떻게 든 나는 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특별히 테스트 중이므로 다른 값을 대체로 사용할 수 있습니다.
(value or 0)- INT 타입 캐스팅없이 - 우리가 그 값 만 없음 또는 INT 수 없다 보장 경우
이러한 상황을 처리하는 일반적인 "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
int()과 같은 복소수 것은 int(1+2j), 또한이 원인이됩니다 TypeError제기 될 틀림 아마 매우 가능성이 있다고하지만. 어쨌든, 나는 당신이 의심 할 여지없이 일반적으로 따라야 할 좋은 조언이 될 것이라고 생각합니다.
이 유형의 오류에 대해 int (x 또는 0)를 성공적으로 사용했지만 None이 논리에서 0과 같아야합니다. x 테스트가 False를 반환하는 다른 경우에도이 값이 0으로 확인됩니다. 예 : 빈 목록, 세트, 사전 또는 길이가 0 인 문자열. 죄송합니다. Kindall이 이미이 답변을주었습니다.
이것은 함수에서 값을 반환하는 것을 잊은 경우 발생할 수 있습니다. 그런 다음 None을 반환합니다. 해당 변수에 할당하는 모든 위치를 살펴보고 그중 하나가 함수에 return 문이없는 함수 호출인지 확인합니다.
return대신 평범한 return 문이 하나 이상 있습니다 return some_expression.
return None문이 포함되어 있습니다
계산을 수행하기 전에 값이 None 이 아닌지 확인해야 합니다.
my_value = None
if my_value is not None:
print int(my_value) / 2
참고 : my_value 코드가 작동하고 검사가 수행되고 있음을 증명하기 위해 의도적으로 없음으로 설정되었습니다.
is [not] None)를 사용해야합니다
my_value무조건 없음으로 설정합니다 . 왜? OP가 "일반적으로 숫자" 일 int(my_value)때 왜 그가해야한다고 생각하는지 의문을 제기하지 않습니다 my_value.
파이썬 이메일 기능을 사용하여 동일한 문제가 발생했습니다. 아래는 이메일 제목을 변수로 검색하려는 코드입니다. 이것은 대부분의 이메일에서 잘 작동하며 변수가 채워집니다. Yahoo 등으로부터 이메일을 받고 발신자가 제목 줄을 작성하지 않은 경우 Yahoo는 이메일에 제목 줄을 만들지 않으며 함수에서 반환 된 NoneType을 얻습니다. Martineau는 Soviut와 함께 정답을 제공했습니다. IMO Soviut의 대답은 프로그래밍 관점에서 더 간결합니다. 반드시 파이썬에서 온 것은 아닙니다. 기술을 보여주는 몇 가지 코드는 다음과 같습니다.
import sys, email, email.Utils
afile = open(sys.argv[1], 'r')
m = email.message_from_file(afile)
subject = m["subject"]
# Soviut's Concise test for unset variable.
if subject is None:
subject = "[NO SUBJECT]"
# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)
try:
if len(subject) == 0:
subject = "[NO SUBJECT]"
except TypeError:
subject = "[NO SUBJECT]"
print subject
afile.close()
어떤 상황에서는 None을 int 0으로 변환하는 함수가 있으면 도움이됩니다.
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value