TypeError: T 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इसे अनुक्रम के रूप में लिया जाता है, तो यह पूरी तरह से हानिरहित एक खाली अनुक्रम उत्पन्न करना चाहिए।
नेहमे

7
@nehemiah: पायथन दृढ़ता से टाइप किया गया है (बस स्टैटिकली टाइप नहीं किया गया है)। Noneकभी किसी चीज के लिए मजबूर नहीं किया जाता है । बीत रहा है Noneचुपचाप अन्य प्रकार खाल त्रुटियों की तरह व्यवहार; यह "हानिरहित" के विपरीत है। यदि आपको खाली अनुक्रम के लिए एक मिथ्या प्लेसहोल्डर की आवश्यकता है, तो आप उपयोग कर सकते हैं ()या ''/ "", जो दोनों एकल हैं और सस्ते के रूप में लोड किए जा सकते हैं None। यदि आप किसी भी चीज़ को मूर्खतापूर्ण व्यवहार करने के लिए खाली अनुक्रम के रूप में चुनना चाहते हैं, तो आप कर सकते हैं for row in data or ():, लेकिन कोई भी ऐसा नहीं करता है, क्योंकि Noneकिसी फ़ंक्शन से अनुक्रम की अपेक्षा करना एक त्रुटि है जो चुपचाप पास नहीं होनी चाहिए।
शैडो रेंजर

जवाबों:


203

यह के मूल्य का मतलब dataहै None


37
सही, लेकिन आम परिदृश्य लेखक का यहाँ forएक अपवाद बढ़ाने के बजाय लूप को छोड़ना है। अजगर का डिज़ाइन यहाँ त्रुटिपूर्ण है। जब Noneइसे एक पुनरावृत्ति के रूप में माना जाता है, तो इसे कम से कम सूची को वापस करना होगा। इस अपवाद ने वास्तविक जीवन में किसी को भी मदद करने के अलावा हमें कुछ बदसूरत if data is not None:तरह से सम्मिलित करने में मदद नहीं की ।
नेहमे

एक और अधिक ठोस जवाब के लिए, यह तब हो सकता है fieldlistके लिए DictWriterहै None!
अर्कलुर

30
कोशिश करेंfor i in data or []
बीएमडब्ल्यू

4
@ स्नेही: वास्तव में, सही दृष्टिकोण यह जांचने के लिए नहीं है कि क्या dataहै या नहीं None, लेकिन अपवाद होने दें। आप चाहते हैं पता करने के लिए जब वे इसे गलत तरीके से उपयोग किया है अपने एपीआई के उपभोक्ताओं। Noneएक खाली अनुक्रम के रूप में स्वीकार mylist = mylist.extend(morestuff)करने से गलतियाँ हो सकती हैं , और अधिक लंबे समय तक छिपाने का प्रबंधन करें; उन्हें लगता है कि वे extendएक एड करते हैं list(और उन्होंने किया था, लेकिन फिर तुरंत इसे बदल दिया गया None), फिर इसे ओपी के फ़ंक्शन में पास करें और आश्चर्य करें कि फ़ाइल खाली क्यों है, जिसमें किसी भी प्रकार की कोई त्रुटि नहीं है।
शैडो रेंजर

83

त्रुटि की व्याख्या: 'कोई नहीं टाइप' वस्तु चलने योग्य नहीं है

Python2 में, कोई नहीं टाइप कोई भी नहीं है। उदाहरण के लिए Python3 में कोई नहीं है

>>> 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.

उस चर पर इरेटिंग करना जिसका कोई मूल्य नहीं है, विफल रहता है:

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

यदि वे कोई मान नहीं लौटाते हैं, तो पायथन तरीके कोई नहीं लौटते हैं:

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

आपको इस तरह से किसी भी प्रकार के लिए अपने लूपिंग निर्माणों की जांच करने की आवश्यकता है:

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जांच के लिए उपयोग करें Noneक्योंकि isपहचान की जांच करने के लिए अधिक मजबूत है। समानता संचालन का उपयोग न करें क्योंकि वे अपने स्वयं के कार्यान्वयन के बबल-अप कार्यान्वयन कर सकते हैं। पायथन के कोडिंग स्टाइल दिशानिर्देश - PEP-008

कोई नहीं टपके चुपके हैं, और भेड़ के बच्चे से चुपके कर सकते हैं:

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 bytecode में बदल दिया। पायथन वर्चुअल मशीन ने बाइटकोड को संसाधित किया, इसमें एक लूपिंग निर्माण का सामना करना पड़ा, जिसने कहा कि कोई भी नहीं वाले चर पर पुनरावृति। __iter__कोई नहीं पर विधि को लागू करके ऑपरेशन किया गया था ।

किसी के पास कोई __iter__विधि निर्धारित नहीं है , इसलिए पायथन की वर्चुअल मशीन आपको बताती है कि वह क्या देखता है: कि कोई भी टाइप __iter__विधि नहीं है।

यही कारण है कि पायथन की बतख-टाइपिंग विचारधारा को बुरा माना जाता है। प्रोग्रामर एक चर के साथ पूरी तरह से उचित कुछ करता है और रनटाइम पर यह किसी के द्वारा दूषित नहीं होता है, अजगर आभासी मशीन सैनिक पर प्रयास करता है, और कालीन पर असंबंधित बकवास का एक गुच्छा ऊपर उठाता है।

जावा या C ++ में ये समस्याएँ नहीं हैं क्योंकि इस तरह के कार्यक्रम को संकलित करने की अनुमति नहीं होगी क्योंकि आपने परिभाषित नहीं किया है कि जब कोई नहीं होता है तो क्या करना चाहिए। पायथन प्रोग्रामर को बहुत सी रस्सी देता है जिससे आप खुद को लटका सकते हैं और बहुत सी चीजें कर सकते हैं जिनसे असाधारण परिस्थितियों में काम करने की उम्मीद नहीं की जा सकती। पायथन एक यस-मैन है, यस-सर कह रहा है जब यह आपको खुद को नुकसान पहुंचाने से रोकता है, जैसे कि जावा और सी ++ करता है।


2
(ए) कन्फ्यूज NoneTypeऔर None(बी) सोचता है कि NameError: name 'NoneType' is not definedऔर (सी) अजगर और जावा के बीच तुलना TypeError: cannot concatenate 'str' and 'NoneType' objectsके समान हैं TypeError: 'NoneType' object is not iterable"असंबंधित बकवास का एक गुच्छा है"
जॉन मैकिन

3
उम्म ... जावा में अनिवार्य रूप से समान समस्याएं होती अगर आप nullकिसी संग्रह प्रकार की अपेक्षा करते हुए किसी फ़ंक्शन में जाते। C ++ में एक ही समस्या होगी (लेकिन आम तौर पर बिना कारण बताए सीगफॉल्ट में nullptrमर जाना) । अजगर यहां सही काम कर रहा है; यह "पर बिक्री नहीं" है, यह उस क्षण को बाहर निकाल रहा है जिसे आप Noneकुछ भी करने की कोशिश Noneनहीं कर सकते। आपकी समस्या अजगर के साथ नहीं है, यह सामान्य रूप से गतिशील रूप से टाइप की गई भाषाओं के साथ है।
शैडो रेंजर

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)

यह स्पॉट करने के लिए एक कठिन त्रुटि का एक छोटा सा है क्योंकि त्रुटि का उत्पादन भी किया जा सकता है यदि पंक्ति चर एक पुनरावृत्तियों में से किसी पर नहीं होती है। इसे स्पॉट करने का तरीका यह है कि ट्रेस अंतिम पंक्ति पर विफल रहता है और फ़ंक्शन के अंदर नहीं।

यदि आपका केवल एक चर एक फ़ंक्शन से लौट रहा है, तो मुझे यकीन नहीं है कि त्रुटि उत्पन्न होगी ... मुझे संदेह है "पायथन में ऑब्जेक्ट नहीं है" कोई भी चीज नहीं है "इस मामले में वास्तव में" अरे, मैं कोशिश कर रहा हूं। वापसी मूल्यों पर पुनरावृति करने के लिए उन्हें इन तीन चर में निर्दिष्ट करने के लिए, लेकिन मुझे केवल कोई भी इसे पुनरावृत्त करने के लिए नहीं मिल रहा है "


1
यह वही है जो मुझे यहाँ लाया है। तो ऐसी स्थिति के लिए पायथोनिक समाधान क्या है?
Dr_Zaszuś

1
ऐसा लगता है कि यहाँ कुछ मदद है: stackoverflow.com/questions/1274875/…
Dr_Zaszu18

8

इसका अर्थ है कि डेटा चर कोई भी नहीं (जो कि कोई नहीं टाइप है) गुजर रहा है, इसके कुछ भी नहीं के बराबर है । तो यह एक सूची के रूप में चलने योग्य नहीं हो सकता, जैसा कि आप करने की कोशिश कर रहे हैं।


1
यह अच्छा होगा यदि बस एक खाली सूची की तरह पुनरावृत्त ... क्लीनर कोड और कम त्रुटि की जाँच के लिए
nake

4
@ डैल्टैनाइन यह बहुत सारी समस्याओं के लिए मुझे पता लगाने के लिए और अधिक कठिन बना देगा। मुझे खुशी है कि कोई भी खाली चलने योग्य से अलग नहीं है। यदि आप अपना वर्णित व्यवहार चाहते हैं, तो बस का उपयोग करेंfor row in data or []:
मार्क

7

आप इस तरह तर्कों के साथ write_file पर कॉल कर रहे हैं:

write_file(foo, bar)

लेकिन आपने 'फू' को सही तरीके से परिभाषित नहीं किया है, या आपके पास अपने कोड में एक टाइपो है ताकि यह एक नया खाली चर बना सके और इसमें पास हो सके।


1

मेरे लिए यह अजगर 3 के बजाय मेरी ग्रूवी टोपी होने का मामला था ।

returnकिसी defफ़ंक्शन के अंत में कीवर्ड को भूल गए ।

कुछ महीनों के लिए बयाना में अजगर 3 कोडिंग नहीं किया गया था। सोच रहा था कि रूटीन में मूल्यांकन किए गए अंतिम कथन को ग्रूवी के अनुसार वापस किया जा रहा था।

कुछ पुनरावृत्तियों को लिया, स्टैक ट्रेस को देखते हुए, try: ... except TypeError: ...ब्लॉक डिबगिंग / स्टेपिंग कोड को सम्मिलित करके यह पता लगाने के लिए कि क्या गलत था।

संदेश के समाधान ने निश्चित रूप से त्रुटि को मुझसे बाहर नहीं निकाला।


धन्यवाद। यह वास्तव में मेरी समस्या थी। मैं पागल होने वाला था ...
जे। ब्रेट कनिंघम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.