TypeError : Python에서 'NoneType'객체를 반복 할 수 없습니다


145

오류 란 무엇입니까 TypeError: 'NoneType' object is not iterable?

나는이 파이썬 코드에서 그것을 얻고있다 :

def write_file(data, filename): # creates file and writes list to it
  with open(filename, 'wb') as outfile:
    writer = csv.writer(outfile)
    for row in data: # ABOVE ERROR IS THROWN HERE
      writer.writerow(row)

이것은 파이썬에서 성가신 실망 중 하나입니다. None시퀀스로 강제 변환 되면 완전히 무해한 빈 시퀀스를 생성해야합니다.
nehem

7
@nehemiah : 파이썬은 강력하게 타이핑됩니다 (정적으로 타이핑되지는 않음). None절대로 아무것도 강요되지 않습니다 . 갖는 None다른 종류의 가죽 오류처럼 행동 자동; 그것은 "무해한" 의 반대 입니다. 빈 시퀀스에 잘못된 자리 표시자가 필요한 경우 또는를 사용할 수 있습니다. ()또는 ''/ ""는 모두 싱글 톤이며 값 이 싸다 None. 잘못된 것을 빈 시퀀스로 자동 처리하도록 옵트 인하려면 할 수 for row in data or ():있지만 None시퀀스를 기대하는 함수에 전달 하는 것은 자동으로 통과해서는 안되는 오류 이기 때문에 아무도 할 수 없습니다.
ShadowRanger

답변:


203

의 값은 data입니다 None.


37
그러나 여기에서 의도 한 일반적인 시나리오 작성자 for는 예외를 발생시키는 대신 루프 를 건너 뛰는 것입니다. 파이썬의 디자인은 여기에 결함이 있습니다. Noneiterable로 취급 되면 적어도 빈 목록을 반환해야합니다. 이 예외는 우리가 못생긴 if data is not None:종류의 핸들링을 삽입하도록하는 것 외에는 현실의 어느 누구에게도 도움이되지 않았습니다 .
nehem

좀 더 구체적인 답변을 들어,이 경우 발생할 수 fieldlist에 대한이 DictWriter입니다 None!
Arklur

30
시도for i in data or []
BMW

4
@nehemiah : 실제로 올바른 접근 방식은 datais 또는 is 아닌지 확인하는 것이 None아니라 예외가 발생하도록하는 것입니다. 당신이 원하는 그들이 잘못을 사용했습니다 때 알고 당신의 API의 소비자. None빈 시퀀스로 받아들이면 과 같은 실수는 mylist = mylist.extend(morestuff)더 오래 숨길 수 있습니다. 그들은 자신이 a라고 생각 extend하고 list(그런데 즉시 그것을으로 대체 None) OP의 기능에 전달하고 파일이 비어있는 이유를 궁금해합니다.
ShadowRanger

83

오류 설명 : 'NoneType'오브젝트를 반복 할 수 없습니다

python2에서 NoneType은 None 유형입니다. Python3에서 NoneType은 None 클래스입니다. 예를 들면 다음과 같습니다.

>>> print(type(None))     #Python2
<type 'NoneType'>         #In Python2 the type of None is the 'NoneType' type.

>>> print(type(None))     #Python3
<class 'NoneType'>        #In Python3, the type of None is the 'NoneType' class.

값이 None 인 변수를 반복하면 실패합니다.

for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

파이썬 메소드는 값을 반환하지 않으면 NoneType을 반환합니다.

def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

다음과 같이 NoneType에 대한 루핑 구문을 확인해야합니다.

a = None 
print(a is None)              #prints True
print(a is not None)          #prints False
print(a == None)              #prints True
print(a != None)              #prints False
print(isinstance(a, object))  #prints True
print(isinstance(a, str))     #prints False

귀도는 신원 확인에 더 강력하기 때문에 is확인 에만 사용한다고 말합니다 . 평등 연산을 사용하지 마십시오. 자체적으로 풍선 업 구현 염을 뱉을 수 있습니다. 파이썬 코딩 스타일 가이드 라인-PEP-008Noneis

유형은 음흉하며 람다에서 몰래 들어올 수 있습니다.

import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

유형이 유효한 키워드가 아닙니다 :

a = NoneType     #NameError: name 'NoneType' is not defined

연결 None및 문자열 :

bar = "something"
foo = None
print foo + bar    #TypeError: cannot concatenate 'str' and 'NoneType' objects

무슨 일이야?

파이썬의 인터프리터는 코드를 pyc 바이트 코드로 변환했습니다. 파이썬 가상 머신이 바이트 코드를 처리했으며, None을 포함하는 변수를 반복하는 루핑 구조가 발생했습니다. 조작은 __iter__None 에서 메소드를 호출하여 수행되었습니다 .

None은 __iter__메소드가 정의 되어 있지 않으므로 Python의 가상 머신은 그것이 보이는 것을 알려줍니다 __iter__. NoneType에는 메소드 가 없습니다 .

이것이 파이썬의 오리 타이핑 이데올로기가 나쁜 것으로 간주되는 이유 입니다. 프로그래머는 변수로 완전히 합리적인 작업을 수행하고 런타임에 Python 가상 머신이 병사를 시도하고 카펫 전체에서 무관심한 무의미한 소리를 퍼 붓는 None에 의해 오염됩니다.

Java 또는 C ++에는 None이 발생할 때 수행 할 작업을 정의하지 않았기 때문에 이러한 프로그램을 컴파일 할 수 없기 때문에 이러한 문제가 없습니다. 파이썬은 프로그래머가 예외적 인 상황에서 작동하지 않을 수있는 많은 일을 할 수있게함으로써 자신에게 매달릴 수있는 많은 밧줄을 제공합니다. 파이썬은 예스맨으로, 자바 나 C ++처럼 자신을 해치지 않기 위해 예스 르를 말합니다.


2
(a)는 혼란 NoneTypeNone(b)는 생각 NameError: name 'NoneType' is not definedTypeError: cannot concatenate 'str' and 'NoneType' objects와 동일 TypeError: 'NoneType' object is not iterable(c)는 파이썬과 자바의 비교가 "관련이없는 넌센스의 무리"입니다
존 머신

3
음 ... null콜렉션 유형을 기대하는 함수에 전달하면 Java는 본질적으로 동일한 문제가 있습니다 . C ++은 같은 문제가 있지만 (일반적으로 원인을보고하지 않고 segfault에서 죽습니다) nullptr(물론 좋은 C ++은 포인터를 거의 사용하지 않지만 시연 한 것은 나쁜 파이썬이며 런타임에 잘못된 C ++도 null에서 죽을 수 있습니다) . 파이썬은 여기서 올바른 일을하고 있습니다. 당신이 사용하려고하는 순간 밖으로 erroring 것 "에 병역에"아니에요 None아무것도 None할 수 있습니다. 문제는 파이썬이 아니라 일반적으로 동적으로 입력되는 언어에 관한 것입니다.
ShadowRanger

63

코드 : for row in data:
오류 메시지 :TypeError: 'NoneType' object is not iterable

어떤 대상에 대해 불평하고 있습니까? 두 가지의 선택, row그리고 data. 에서 for row in data반복 가능해야하는 것은 무엇입니까? 만 data.

무엇이 문제 data입니까? 유형은 NoneType입니다. None유형 만 있습니다 NoneType. 그래서 data is None.

IDE에서 또는 명령문 print "data is", repr(data)앞에 삽입 for하고 다시 실행 하여이를 확인할 수 있습니다 .

다음에해야 할 일을 생각해보십시오. "데이터 없음"을 어떻게 표현해야합니까? 빈 파일을 작성합니까? 우리는 예외를 제기하거나 경고를 기록하거나 침묵을 유지합니까?


18

이 오류를 발생시킬 수있는 또 다른 것은 함수의 반환 값과 동일한 값을 설정하지만 실제로는 아무것도 반환하지 않은 경우입니다.

예:

def foo(dict_of_dicts):
    for key, row in dict_of_dicts.items():
        for key, inner_row in row.items():
            Do SomeThing
    #Whoops, forgot to return all my stuff

return1, return2, return3 = foo(dict_of_dicts)

이것은 반복 중 하나에서 행 변수가 없음 인 경우에도 오류가 발생할 수 있기 때문에 발견하기 어려운 약간의 오류입니다. 이를 파악하는 방법은 트레이스가 함수 내에서가 아니라 마지막 라인에서 실패한다는 것입니다.

함수에서 하나의 변수를 반환하는 경우 오류가 발생하는지 확실하지 않습니다 ...이 경우 " 'NoneType'객체를 파이썬에서 반복 할 수 없습니다"라는 오류가 실제로 "내가 노력하고 있습니다. 이 세 변수에 순서대로 값을 할당하기 위해 반환 값을 반복하지만 반복하지는 않습니다. "


1
이것이 바로 나를 여기로 데려온 것입니다. 그렇다면 그러한 상황에 대한 Pythonic 솔루션은 무엇입니까?
Dr_Zaszuś

1
여기에 도움이있는 것 같습니다 : stackoverflow.com/questions/1274875/…
Dr_Zaszuś

8

또한 상기 데이터 변수가 동등한 (NoneType 형이다) 없음을 전달하지 않음을 의미 아무것도 . 따라서 시도하는 것처럼 목록으로 반복 할 수 없습니다.


1
빈리스트처럼 반복한다면 좋을 것입니다. 코드를 깨끗하게하고 오류 검사를 줄이십시오.
deltanine

4
@deltanine 그것은 많은 문제를 감지하기가 더 어려워 질 것이라고 생각합니다. 나는 빈 iterable과 다른 것이 기쁘다. 설명 된 동작을 원하면 다음을 사용하십시오.for row in data or []:
Mark

7

다음과 같은 인수로 write_file을 호출합니다.

write_file(foo, bar)

그러나 'foo'를 올바르게 정의하지 않았거나 코드에 오타가있어 빈 변수가 새로 만들어 전달됩니다.


1

저에게는 Python 3 대신 Groovy 모자쓰는 경우였습니다 .

함수 return끝에서 키워드를 잊어 버렸습니다 def.

몇 달 동안 파이썬 3을 본격적으로 코딩하지 않았습니다. 일상에서 평가 된 마지막 진술이 그루비 방식으로 반환되었다고 생각했습니다.

스택 추적을 살펴보고 try: ... except TypeError: ...블록 디버깅 / 스테핑 코드를 삽입 하여 무엇이 잘못되었는지 파악 하는 몇 가지 반복을 수행했습니다 .

메시지에 대한 해결책으로 인해 오류가 발생하지 않았습니다.


감사합니다. 이것은 정확히 내 문제였습니다. 나는 미쳐 가고 있었다 ...
J. Brett Cunningham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.