Typeerror: كائن "nontype" ليس أمرًا لا يتجزأ في بيثون

StackOverflow https://stackoverflow.com/questions/3887381

  •  28-09-2019
  •  | 
  •  

سؤال

ماذا يفعل الخطأ 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)
هل كانت مفيدة؟

المحلول

وهذا يعني قيمة data هو None.

نصائح أخرى

شرح الخطأ: كائن "nontype" غير مبهم

في Python2 ، nontype هو نوع لا شيء. في Python3 nontype هي فئة لا شيء ، على سبيل المثال:

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

تعيد طرق Python nontype إذا لم ترد قيمة:

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

يقول Guido فقط الاستخدام is للتحقق من None لان is هو أكثر قوة لفحص الهوية. لا تستخدم عمليات المساواة لأن هؤلاء يمكن أن يبصقوا التهاب تنفيذ الفقاعات الخاصة بهم. إرشادات نمط ترميز بيثون - PEP -008

nontypes متستر ، ويمكن التسلل من Lambdas:

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

Nontype ليست كلمة رئيسية صالحة:

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

تسلسل None وسلسلة:

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

ماذا يحدث هنا؟

قام مترجم Python بتحويل الكود الخاص بك إلى Pyc bytecode. قام الجهاز الظاهري Python بمعالجة رمز Bytecode ، واجه بنية حلقة قال يكرر على متغير يحتوي على أي شيء. تم تنفيذ العملية من خلال استدعاء __iter__ طريقة على لا شيء.

لا شيء لا __iter__ الطريقة المحددة ، لذلك يخبرك الجهاز الظاهري لـ Python بما يراه: أن nontype ليس له __iter__ طريقة.

هذا هو السبب بيثون بطة بطة يعتبر الأيديولوجية سيئة. يقوم المبرمج بشيء معقول تمامًا مع متغير ، وفي وقت التشغيل ، يتم تلوثه من قِبل لا شيء ، ويحاول الجهاز الظاهري للبيثون الجندي ، ويحتل مجموعة من الهراء غير ذي الصلة في جميع أنحاء السجادة.

لا تواجه Java أو C ++ هذه المشكلات لأن مثل هذا البرنامج لن يُسمح له بالتجميع لأنك لم تحدد ما يجب القيام به عندما لا يحدث أي شيء. يمنح Python المبرمج الكثير من الحبل لتعليق نفسه من خلال السماح لك بالقيام بالكثير من الأشياء التي لا يمكن توقع أن تعمل في ظل ظروف استثنائية. بيثون هو رجل نعم ، يقول نعم-عندما يمنعك أن يمنعك من إيذاء نفسك ، مثل Java و C ++.

شفرة: 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 بيان ، وإعادة تشغيل.

فكر فيما تحتاج إلى القيام به بعد ذلك: كيف ينبغي تمثيل "لا توجد بيانات"؟ هل نكتب ملف فارغ؟ هل نرفع استثناء أو تسجيل تحذير أم نستمر في الصمت؟

شيء آخر يمكن أن ينتج هذا الخطأ هو عندما تقوم بتعيين شيء مساوٍ للعائد من وظيفة ما ، ولكن نسيت إعادة أي شيء بالفعل.

مثال:

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)

هذا خطأ صعبة في تحديده لأنه يمكن أيضًا إنتاج الخطأ إذا كان متغير الصف لا يوجد في أحد التكرارات. طريقة اكتشافها هي أن التتبع يفشل على السطر الأخير وليس داخل الوظيفة.

إذا كان لديك متغير واحد فقط من دالة ، لست متأكدًا مما إذا كان سيتم إنتاج الخطأ ... أظن أن خطأ "كائن" nontype "ليس أمرًا لا يتجزأ في بيثون" في هذه الحالة يعني في الواقع "مهلا" ، أنا أحاول أن أحاول للتكرار على قيم الإرجاع لتعيينها إلى هذه المتغيرات الثلاثة بالترتيب ، لكنني لا أتكرر سوى "

وهذا يعني أن متغير البيانات يمرر لا شيء (وهو نوع nontype) ، ما يعادله ولا شيء. لذلك لا يمكن أن يكون أمرًا لا يطاق كقائمة ، كما تحاول القيام به.

أنت تتصل بـ Write_file مع وسيطات مثل هذه:

write_file(foo, bar)

لكنك لم تقم بتعريف "Foo" بشكل صحيح ، أو لديك خطأ مطبعي في الكود الخاص بك بحيث يقوم بإنشاء متغير فارغ جديد ومروره.

بالنسبة لي كانت حالة وجود بلدي قبعة رائعة على بدلا من بيثون 3 واحد.

نسيت return الكلمة الرئيسية في نهاية أ def وظيفة.

لم يكن ترميز بيثون 3 بجدية لبضعة أشهر. كان يفكر في البيان الأخير الذي تم تقييمه في الروتين تم إرجاعه في طريقة رائعة.

أخذ بعض التكرارات ، والنظر في تتبع المكدس ، والإدخال try: ... except TypeError: ... كتلة تصحيح الأخطاء/التنقل من خلال رمز لمعرفة ما هو الخطأ.

من المؤكد أن الحل للرسالة لم يجعل الخطأ يقفز في وجهي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top