প্রকারের ত্রুটি: পাইথনে 'ননটাইপ' অবজেক্টটি পুনরাবৃত্তিযোগ্য নয়


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
@ নহিমিয়: পাইথন দৃ strongly়ভাবে টাইপ করা হয় (কেবল স্ট্যাটিকালি টাইপ করা হয় না)। কোন কিছুরNone কাছে কখনই জোর করা হয় না । রয়ে চুপটি অন্যান্য ধরনের চামড়া ত্রুটি মত আচরণ; এটি "নিরীহ" এর বিপরীত । খালি সিকোয়েন্সের জন্য যদি আপনার কোনও মিথ্যা স্থানধারকের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন বা / , যা উভয়ই একক এবং এটি সস্তার মতো লোড করা যায় । আপনি যদি খালি ক্রম হিসাবে মিথ্যা কিছু নিঃশব্দরূপে চিকিত্সা করার জন্য অপ্ট-ইন করতে চান তবে আপনি তা করতে পারেন তবে কেউই তা করে না, কারণ অনুক্রমের প্রত্যাশায় কোনও ফাংশনে যেতে হবে এমন একটি ত্রুটি যা নিঃশব্দে পাস করা উচিত নয়। None()''""Nonefor row in data or ():None
শ্যাডোর্যাঞ্জার

উত্তর:


203

এটা মানের অর্থ হল dataহল None


37
সঠিক, তবে সাধারণ দৃশ্যের লেখক এখানে ব্যর্থতা forবাড়ানোর পরিবর্তে লুপটি এড়িয়ে যাওয়া totally পাইথনের নকশা এখানে ত্রুটিযুক্ত। যখন Noneপুনরাবৃত্তিযোগ্য হিসাবে বিবেচনা করা হয় তবে এটি অবশ্যই কমপক্ষে খালি তালিকায় ফিরে আসতে হবে। এই ব্যতিক্রম সত্যিকারের জীবনে কাউকে কখনও কিছু কুৎসিত if data is not None:হ্যান্ডলিং makingোকানো ছাড়া কখনও সাহায্য করেনি than
নেহেম

আরো কংক্রিট উত্তরের জন্য এটা ঘটতে পারে যদি fieldlistজন্য DictWriterহয় None!
আরক্লুর

30
চেষ্টা করুনfor i in data or []
বিএমডাব্লু

4
@ নহিমিয়: আসলে সঠিক পন্থাটি হচ্ছে কিনা তা যাচাই dataকরা নয় None, ব্যতিক্রম ঘটতে দেওয়া উচিত। আপনি আপনার এপিআইর গ্রাহকরা কখন এটি ভুলভাবে ব্যবহার করেছেন তা জানতে চানNoneএকটি খালি ক্রম হিসাবে গ্রহণ করা ভুলগুলি যেমন mylist = mylist.extend(morestuff)আরও দীর্ঘকে আড়াল করার ব্যবস্থা করতে দেয়; তারা মনে করে যে তারা extendএডি করেছে list(এবং তারা তা করেছে, তবে এটির সাথে সাথে এটি প্রতিস্থাপন করেছে None), তারপরে এটি ওপির ফাংশনে পাস করুন এবং কোনও ধরণের ত্রুটি না বাড়িয়েই ফাইলটি খালি কেন আশ্চর্য হবে।
শ্যাডোর্যাঞ্জার

83

ত্রুটির ব্যাখ্যা: 'ননটাইপ' অবজেক্টটি পুনরাবৃত্ত হয় না

পাইথন 2-এ, নাইনটাইপ হ'ল নন টাইপের টাইপ। পাইথন 3 এ ননটাইপ হ'ল ননটির শ্রেণি, উদাহরণস্বরূপ:

>>> 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এটি পরিচয় পরীক্ষার চেয়ে বেশি দৃ rob়। সমতা ক্রিয়াকলাপগুলি ব্যবহার করবেন না কারণ এগুলি তাদের নিজস্ব বুদ্বুদ আপ বাস্তবায়নকে স্পিট করতে পারে। পাইথনের কোডিং স্টাইল নির্দেশিকা - পিইপি -008 8

ননটাইপগুলি লুক্কায়িত এবং ল্যাম্বডাস থেকে লুকিয়ে থাকতে পারে:

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

এখানে কি হচ্ছে?

পাইথনের দোভাষী আপনার কোডটিকে পাইক বাইটকোডে রূপান্তর করেছেন। পাইথন ভার্চুয়াল মেশিনটি বাইটকোডটি প্রক্রিয়া করেছিল, এটি একটি লুপিং কনস্ট্রাক্টের মুখোমুখি হয়েছিল যা বলে যে কোনওটি নেই এমন একটি ভেরিয়েবলের উপর পুনরাবৃত্তি হবে। নন- __iter__তে পদ্ধতিটি আহ্বান করে অপারেশনটি করা হয়েছিল ।

__iter__কারওরই কোনও পদ্ধতি সংজ্ঞায়িত হয়নি, তাই পাইথনের ভার্চুয়াল মেশিন আপনাকে যা দেখায় তা বলে দেয়: ননটিটাইপের কোনও __iter__পদ্ধতি নেই।

এজন্য পাইথনের হাঁস-টাইপিং আদর্শকে খারাপ বলে মনে করা হয়। প্রোগ্রামারটি একটি পরিবর্তনশীল সহ সম্পূর্ণ যুক্তিসঙ্গত কিছু করে এবং রানটাইমের সময় এটি কোনওটি দ্বারা দূষিত হয় না, পাইথন ভার্চুয়াল মেশিনটি সৈন্যবাহিনীর চেষ্টা করে এবং পুরো কার্পেটের মধ্যে একগুচ্ছ সম্পর্কহীন বাজে কথা বলে।

জাভা বা সি ++ তে এই সমস্যাগুলি নেই কারণ এই জাতীয় প্রোগ্রাম সংকলনের অনুমতি দেওয়া হবে না কারণ যখনই কিছুই ঘটে না তখন আপনি কী করবেন তা আপনি সংজ্ঞায়িত করেননি। পাইথন প্রোগ্রামারকে প্রচুর দড়ি দিয়ে নিজেকে ঝুলিয়ে দেয় যা আপনাকে ব্যতিক্রমী পরিস্থিতিতে কাজ করার আশা করা যায় না। পাইথন হ্যাঁ-ম্যান, হ্যাঁ-স্যার যখন জাভা এবং সি ++ এর মতো আপনাকে নিজের ক্ষতি থেকে বিরত রাখবে তখন বলে saying


2
(ক) বিভ্রান্ত NoneTypeএবং None(খ) মনে করেন যে NameError: name 'NoneType' is not definedএবং TypeError: cannot concatenate 'str' and 'NoneType' objectsমতই TypeError: 'NoneType' object is not iterable(গ) পাইথন এবং জাভা মধ্যে তুলনা "সম্পর্কহীন আজেবাজে কথা একটি গুচ্ছ" হয়
জন Machin

3
উম্ম ... আপনি যদি nullকোনও সংগ্রহের ধরণের প্রত্যাশা করে কোনও ফাংশনটি পাস করেন তবে জাভাতে মূলত অভিন্ন সমস্যা হবে । সি ++ একই সমস্যা হতে পারে (তবে সাধারণত কারণটি না জানিয়ে কেবলমাত্র সেগফ্ল্টে মারা যান) 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

আপনি এটি কোনও আইডিইতে যাচাই করতে পারেন, বা বিবৃতি print "data is", repr(data)দেওয়ার আগে যেমন serোকানো 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_Zaszuś

8

এর অর্থ হ'ল ডেটা ভেরিয়েবলটি কোনওটিই পাস করছে না (যা টাইপ নননটাইপ), এটি কোনও কিছুর সমতুল্য নয় । সুতরাং এটি তালিকা হিসাবে পুনরাবৃত্তিযোগ্য হতে পারে না, আপনি যা করার চেষ্টা করছেন।


1
খালি তালিকার মতো পুনরাবৃত্তি করা খুব ভাল লাগবে ... ক্লিনার কোড এবং কম ত্রুটি পরীক্ষা করার জন্য চেষ্টা করবে
ডেল্টানাইন

4
@ ডেল্টানাইন আমার মনে হয় যে এটি সনাক্ত করা আরও অনেক সমস্যা হয়ে দাঁড়াবে। আমি আনন্দিত যে কোনওটি খালি পুনরাবৃত্তির চেয়ে আলাদা নয়। আপনি যদি নিজের বর্ণিত আচরণ চান তবে কেবল ব্যবহার করুনfor row in data or []:
চিহ্নিত করুন

7

আপনি এই জাতীয় যুক্তি সহ রাইটিং_ফাইলে কল করছেন:

write_file(foo, bar)

তবে আপনি 'foo' সঠিকভাবে সংজ্ঞায়িত করেননি, বা আপনার কোডে একটি টাইপো রয়েছে যাতে এটি একটি নতুন খালি ভেরিয়েবল তৈরি করে এবং এতে প্রবেশ করে।


1

আমার কাছে এটি পাইথন 3 এর পরিবর্তে আমার গ্রোভির টুপি রাখার ঘটনা ছিল ।

returnএকটি defফাংশন শেষে কীওয়ার্ডটি ভুলে গেছেন ।

পাইথন 3 কয়েক মাস ধরে বায়নাতে কোডিং করিনি। রুটিনে মূল্যায়িত শেষ বিবৃতিটি গ্রোভির উপায়ে প্রত্যাবর্তন করা হচ্ছে বলে ভাবছিলাম।

স্ট্যাক ট্রেসটির দিকে তাকিয়ে, try: ... except TypeError: ...কী ভুল ছিল তা নির্ধারণের জন্য ব্লক ডিবাগিং / স্টেপিং থ্রো কোড সন্নিবেশ করিয়ে কয়েকটি পুনরাবৃত্তি নিয়েছিল ।

বার্তাটির সমাধান অবশ্যই ত্রুটিটি আমার দিকে ঝাপিয়ে পড়েনি।


ধন্যবাদ. এটা ঠিক আমার সমস্যা ছিল। আমি পাগল হতে চলেছিলাম ...
জে ব্রেট কানিংহাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.