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


96

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

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

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


5
None이 2771과 같다고 가정합니다. 그러나 그것은 당신이 원하는 것이 아닐 수도 있습니다. 더 많은 정보를 제공해주세요.
JoshD

어떻게 든 나는 Nonetype 값을 얻었고 그것은 int이어야했지만 이제는 Nonetype 객체이고 다른 숫자를 나눌 필요가 있습니다. 그러면 오류가 발생했습니다.
user469652

int(None)None을 int로 변환 할 수 없기 때문에 예외가 발생합니다. 귀하의 질문에 대한 대답은 할 수 없다는 것입니다. 0, 2771 또는 분홍 코끼리와 같은 것을 대체 할 수 있지만 대체하는 것이 무엇이든 여전히 None을 int로 변환 할 수 없습니다.
snapshoe

7
@ ma3204. None분홍 코끼리로 숫자 나누기를 공식적으로 정의하는 숫자 체계를 사용하지 않는 한 분홍 코끼리 로 변환 하는 것도 좋지 않습니다 (그리고이를 백업하는 코드를 작성했습니다)
aaronasterling

답변:


49

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

어떻게 든 나는 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(심지어 존재하는 경우) 완전 코드의 목적에 따라 달라집니다.


5
"올바른"솔루션에 +1. 당신의 창문이 종종 신비스럽게 깨지는 경우, 창문을 막는 대신 왜 (그리고 책임이있는 파괴자를 잡으십시오)

3
예를 들어, 누락 된 키가 없음이므로 redis 사전에서 키를 검색하는 경우에는 유용하지 않습니다. 존재 여부에 관계없이 합산하려면 (완전히 허용되는 동작 임) None을 0으로 변환해야 할 수 있습니다 (kindall 답변 참조)
spider

1
@spider-이는 여전히 상황에 크게 의존한다는 것을 의미하며 "현명한 값 결정"이 여전히 적용됩니다.
detly

Spider의 요점은 매우 타당합니다.이 답변은 기본적으로 당신이 뭔가 잘못했다고 말하지만 None은 그것이 알려지지 않은 값을 의미한다는 것을 의미하지 않습니다. 그것은 당신이 뭔가 잘못했음을 나타낼 수 있습니다. 또는 거미가 누락 된 값을 제안했듯이 일반적으로 0이되어야합니다. 정수가 예상되는 대부분의 None 사용을 위해 1 일 수도 있습니다.
Glen Fletcher

@glenflet 함수의 입력 도메인과 사양이 무엇인지 모르는 경우 인터넷의 낯선 사람이 말할 수 없습니다. 알고 있지만 변환 구문을 모르는 경우 여기에서 묻는 질문과 완전히 다른 질문입니다.
detly

312
int(value or 0)

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

int(0 if value is None else value)

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


64
user469652 대신 이것을 허용 된 답변으로 만드는 것을 고려해야합니다. 생색 반대로 실제로 도움이
galarant

이것이 사용자가 직면 한 문제를 해결하는지 확실하지 않습니다. nonetype을 사용하여 계산을 수행합니다 ... 현재 숫자 값을 포함하는 nonetype을 반환하는 나머지 API를 통해 데이터를 가져오고 있습니다. 내가 0으로 설정하거나두면 내가 그것으로 아무것도 할 수 없어 그대로
br3w5

2
이것은 사용자가 None을 나타내었을 때, 아마도 함수처럼 None을 반환하는 어떤 값을 요청하여 값을 알 수 없음을 나타내야한다는 질문을 감안할 때 도전적으로 최선의 대답입니다.이 경우 None이 기본값이되어야합니다. 사용 사례에서 일반적으로 0입니다. izip_longest, 기본 인수를 고려하십시오. 다른 하나는 다른 기본값 (짝수 유형)을 가지며 기본값은 None이어야하지만 기본값은 문자열로 대체됩니다. <align_n> (str, w)는 너비에 정수만 취합니다.
Glen Fletcher

2
이것을 사용하고 우아하고 내 문제를 해결했습니다.
Dan Safee 2015

1
우리가 사용할 수 있습니다 (value or 0)- INT 타입 캐스팅없이 - 우리가 그 값 만 없음 또는 INT 수 없다 보장 경우
hashlash

16

이러한 상황을 처리하는 일반적인 "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의 잠재적 인 문제 중 하나 는 사용중인 코드 또는 타사 모듈의 다른 부분에 문제가 있다는 사실을 숨길 수 있다는 것입니다. 특히 예외가 자주 발생하므로 실제로 "예외적 인"경우가 아닙니다. 조금도).


11

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


전달 int()과 같은 복소수 것은 int(1+2j), 또한이 원인이됩니다 TypeError제기 될 틀림 아마 매우 가능성이 있다고하지만. 어쨌든, 나는 당신이 의심 할 여지없이 일반적으로 따라야 할 좋은 조언이 될 것이라고 생각합니다.
마티

5

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

foo = bar or 0
foo2 = bar or ""

2

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


1

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


1
... 또는 함수에 return대신 평범한 return 문이 하나 이상 있습니다 return some_expression.
John Machin

... 또는 함수에 하나 이상의 return None문이 포함되어 있습니다
John Machin

1

계산을 수행하기 전에 값이 None 이 아닌지 확인해야 합니다.

my_value = None
if my_value is not None:
    print int(my_value) / 2

참고 : my_value 코드가 작동하고 검사가 수행되고 있음을 증명하기 위해 의도적으로 없음으로 설정되었습니다.


1
신원 비교 ( is [not] None)를 사용해야합니다
shylent

-4 OP를 피하는 대신 그의 진짜 문제가 무엇인지 알아 내도록 격려해야합니다. @shylent가 말한 것. my_value무조건 없음으로 설정합니다 . 왜? OP가 "일반적으로 숫자" 일 int(my_value)때 왜 그가해야한다고 생각하는지 의문을 제기하지 않습니다 my_value.
John Machin

1
내 코드가 실패하지 않음을 보여주기 위해 my_value를 개념 증명으로 None으로 설정했습니다. 값이 항상 숫자가 아닐 수있는 많은 이유가 있고 계산을 수행하기 전에 값이 있는지 확인하는 것이 좋은 생각이기 때문에 OP에 의문을 제기하지 않았습니다. OP의 질문에 단순히 대답하는 것은 잘못된 것이 아닙니다. 나는 그들을 위해 모든 숙제를 할 필요가 없습니다.
Soviut

1

파이썬 이메일 기능을 사용하여 동일한 문제가 발생했습니다. 아래는 이메일 제목을 변수로 검색하려는 코드입니다. 이것은 대부분의 이메일에서 잘 작동하며 변수가 채워집니다. 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()

1

어떤 상황에서는 None을 int 0으로 변환하는 함수가 있으면 도움이됩니다.

def nz(value):

    '''
    Convert None to int zero else return value.
    '''

    if value == None:
        return 0
    return value
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.