উত্তর:
পাইথনে, 'নাল' অবজেক্টটি সিঙ্গলটন None।
"অদ্বিতীয়তা" এর জন্য জিনিসগুলি পরীক্ষা করার সর্বোত্তম উপায় হ'ল পরিচয় অপারেটরটি ব্যবহার করা is:
if foo is None:
...
None, পাইথনের নাল?কোন ব্যাপার nullপাইথন মধ্যে, পরিবর্তে আছে None। যেমন ইতিমধ্যে বলা হয়েছে পরীক্ষার সর্বাধিক সঠিক উপায় যা Noneমান হিসাবে কিছু দেওয়া হয়েছে তা হ'ল isপরিচয় অপারেটর, যা পরীক্ষা করে যে দুটি ভেরিয়েবল একই বস্তুকে বোঝায় to
>>> foo is None
True
>>> foo = 'bar'
>>> foo is None
False
NoneNoneক্লাসের একমাত্র উদাহরণ এবং সেই ক্লাসটি NoneTypeইনস্ট্যান্ট করার জন্য আরও যে কোনও প্রচেষ্টা হ'ল একই বস্তুটি ফিরে আসবে, যা Noneএকটি সিঙ্গলটন করে। পাইথনে আগত নবীরা প্রায়শই ত্রুটি বার্তাগুলি দেখতে পান NoneTypeযা এটি কী এবং তা অবাক করে। এটি আমার ব্যক্তিগত মত যে এই বার্তাগুলি কেবল নাম Noneদ্বারা উল্লেখ করতে পারে কারণ আমরা শীঘ্রই দেখতে পাচ্ছি, Noneঅস্পষ্টতার খুব কম জায়গা ছেড়ে যায়। সুতরাং আপনি যদি TypeErrorএমন কোনও বার্তা দেখেন যা উল্লেখ করে যে এটি NoneTypeকরতে পারে না বা এটি করতে পারে না, কেবলমাত্র জেনে রাখুন যে এটি কেবল এটিই Noneএমনভাবে ব্যবহৃত হচ্ছে যা এটি করতে পারে না।
এছাড়াও, Noneপাইথন শুরু করার সাথে সাথে এটি মডিউল, শ্রেণি বা ফাংশনে হোক না কেন এটি যে কোনও জায়গা থেকে ব্যবহারের জন্য উপলব্ধ। NoneTypeবিপরীতে নয়, Noneএর ক্লাসের জন্য জিজ্ঞাসা করে আপনার প্রথমে এটির একটি রেফারেন্স পাওয়া দরকার ।
>>> NoneType
NameError: name 'NoneType' is not defined
>>> type(None)
NoneType
আপনি Noneপাইথনের পরিচয় ফাংশনটির স্বতন্ত্রতা পরীক্ষা করতে পারেন id()। এটি কোনও অবজেক্টকে নির্ধারিত অনন্য নম্বর প্রদান করে, প্রতিটি বস্তুর একটি থাকে। যদি দুটি ভেরিয়েবলের আইডি একই হয় তবে তারা বাস্তবে একই বস্তুর দিকে নির্দেশ করে।
>>> NoneType = type(None)
>>> id(None)
10748000
>>> my_none = NoneType()
>>> id(my_none)
10748000
>>> another_none = NoneType()
>>> id(another_none)
10748000
>>> def function_that_does_nothing(): pass
>>> return_value = function_that_does_nothing()
>>> id(return_value)
10748000
None ওভাররাইট করা যায় নাপাইথনের অনেক পুরানো সংস্করণে (২.৪ এর আগে) পুনরায় সাইন করা সম্ভব হয়েছিল None, তবে আর নয়। এমনকি কোনও শ্রেণি বৈশিষ্ট্য হিসাবে বা কোনও ফাংশনের সীমানায় নয়।
# In Python 2.7
>>> class SomeClass(object):
... def my_fnc(self):
... self.None = 'foo'
SyntaxError: cannot assign to None
>>> def my_fnc():
None = 'foo'
SyntaxError: cannot assign to None
# In Python 3.5
>>> class SomeClass:
... def my_fnc(self):
... self.None = 'foo'
SyntaxError: invalid syntax
>>> def my_fnc():
None = 'foo'
SyntaxError: cannot assign to keyword
সুতরাং এটি ধরে নেওয়া নিরাপদ যে সমস্ত Noneতথ্যসূত্র একই রকম। কোনও "রীতি" নেই None।
Noneব্যবহারের জন্য পরীক্ষা করাisকোড লেখার সময় আপনি এই জাতীয় অদ্বিতীয়তার জন্য পরীক্ষা করার জন্য প্রলুব্ধ হতে পারেন:
if value==None:
pass
অথবা এই মত মিথ্যা জন্য পরীক্ষা
if not value:
pass
এর প্রভাবগুলি এবং আপনার স্পষ্ট হওয়া কেন প্রায়ই ভাল ধারণা হয় তা বুঝতে হবে।
Noneকেন এই কাজ
value is None
বরং
value==None
প্রথমটি এর সমতুল্য:
id(value)==id(None)
যদিও অভিব্যক্তিটি value==Noneবাস্তবে এটি প্রয়োগ করা হয়
value.__eq__(None)
মানটি যদি সত্যিই হয় Noneতবে আপনি যা প্রত্যাশা করেছিলেন তা পাবেন।
>>> nothing = function_that_does_nothing()
>>> nothing.__eq__(None)
True
বেশিরভাগ সাধারণ ক্ষেত্রে ফলাফলটি একই রকম হয় তবে __eq__()পদ্ধতিটি এমন একটি দরজা খোলে যা নির্ভুলতার কোনও গ্যারান্টি দেয়, কারণ এটি একটি শ্রেণিতে বিশেষ আচরণ প্রদানের জন্য ওভাররাইড করা যেতে পারে।
এই শ্রেণি বিবেচনা করুন।
>>> class Empty(object):
... def __eq__(self, other):
... return not other
তাই আপনি যদি এটি ব্যবহার করে দেখুন Noneএবং এটি কাজ করে
>>> empty = Empty()
>>> empty==None
True
তবে তারপরে এটি খালি স্ট্রিংয়েও কাজ করে
>>> empty==''
True
এবং এখনো
>>> ''==None
False
>>> empty is None
False
Noneবুলিয়ান হিসাবে ব্যবহার করানিম্নলিখিত দুটি পরীক্ষা
if value:
# do something
if not value:
# do something
আসলে হিসাবে মূল্যায়ন করা হয়
if bool(value):
# do something
if not bool(value):
# do something
Noneএটি একটি "মিথ্যা", যার অর্থ একটি বুলিয়ানকে কাস্ট করা হলে এটি ফিরে আসবে Falseএবং notঅপারেটর প্রয়োগ করা হলে এটি ফিরে আসবে True। তবে লক্ষ করুন যে এটি কোনও সম্পত্তি নয় None। Falseনিজের পাশাপাশি , সম্পত্তি খালি তালিকা, টিপলস, সেট, ডিক্টস, স্ট্রিং, পাশাপাশি 0 দ্বারা ভাগ করে নেওয়া হয়েছে এবং ক্লাস থেকে আসা সমস্ত বস্তু যা __bool__()ম্যাজিক পদ্ধতিতে ফিরে আসার জন্য প্রয়োগ করে False।
>>> bool(None)
False
>>> not None
True
>>> bool([])
False
>>> not []
True
>>> class MyFalsey(object):
... def __bool__(self):
... return False
>>> f = MyFalsey()
>>> bool(f)
False
>>> not f
True
সুতরাং নিম্নলিখিত পদ্ধতিতে ভেরিয়েবলগুলির জন্য পরীক্ষা করার সময়, আপনি কী পরীক্ষা করছেন বা বাদ দিচ্ছেন সে সম্পর্কে অতিরিক্ত সচেতন হন:
def some_function(value=None):
if not value:
value = init_value()
উপরের দিকে, init_value()যখন মানটি নির্দিষ্টভাবে সেট করা থাকে তখন আপনি কল করতে চেয়েছিলেন None, বা আপনি যে কোনও মান সেট করেছেন 0, বা খালি স্ট্রিং, বা একটি খালি তালিকাটিও আরম্ভের সূচনা করতে হবে? যেমন আমি বলেছি, মনোযোগ দিন। যেহেতু প্রায়শই পাইথনের স্পষ্টতই বিষয়টি অন্তর্নিহিতের থেকে ভাল ।
None প্রস্তুতিতেNone সিগন্যাল মান হিসাবে ব্যবহৃতNoneপাইথনে একটি বিশেষ মর্যাদা রয়েছে। এটি একটি প্রিয় বেসলাইন মান কারণ অনেক অ্যালগরিদম এটিকে ব্যতিক্রমী মান হিসাবে বিবেচনা করে। এ জাতীয় পরিস্থিতিতে এটি একটি পতাকা হিসাবে ব্যবহার করে সিগন্যাল করতে পারে যে কোনও শর্তের জন্য কিছু বিশেষ হ্যান্ডলিং প্রয়োজন (যেমন একটি ডিফল্ট মান নির্ধারণ)।
আপনি Noneকোনও ফাংশনের কীওয়ার্ড আর্গুমেন্টগুলিকে বরাদ্দ করতে পারেন এবং তারপরে এটি স্পষ্টভাবে পরীক্ষা করতে পারেন।
def my_function(value, param=None):
if param is None:
# do something outrageous!
কোনও বস্তুর বৈশিষ্ট্যটি পাওয়ার চেষ্টা করার সময় আপনি এটিকে ডিফল্ট হিসাবে ফিরিয়ে দিতে পারেন এবং তারপরে বিশেষ কিছু করার আগে স্পষ্টভাবে এটির জন্য পরীক্ষা করতে পারেন।
value = getattr(some_obj, 'some_attribute', None)
if value is None:
# do something spectacular!
অ-বিদ্যমান কীটি অ্যাক্সেস করার চেষ্টা করার সময় ডিফল্টরূপে একটি অভিধানের get()পদ্ধতি ফিরে আসে None:
>>> some_dict = {}
>>> value = some_dict.get('foo')
>>> value is None
True
আপনি যদি সাবস্ক্রিপ্ট স্বরলিপি ব্যবহার করে এটি অ্যাক্সেস করার চেষ্টা করেন তবে একটি KeyErrorউত্থাপিত হবে
>>> value = some_dict['foo']
KeyError: 'foo'
অনুরূপভাবে যদি আপনি কোনও অ-বিদ্যমান আইটেম পপ করার চেষ্টা করেন
>>> value = some_dict.pop('foo')
KeyError: 'foo'
যা আপনি সাধারণত সেট করা একটি ডিফল্ট মান দিয়ে দমন করতে পারেন None
value = some_dict.pop('foo', None)
if value is None:
# booom!
None পতাকা এবং বৈধ মান উভয় হিসাবে ব্যবহৃতউপরোক্ত বর্ণিত Noneপ্রয়োগগুলি প্রয়োগের প্রয়োগ যখন এটি একটি বৈধ মান হিসাবে বিবেচনা করা হয় না, তবে আরও বিশেষ কিছু করার সংকেতের মতো। এমন পরিস্থিতি রয়েছে যেখানে মাঝে মাঝে এটি Noneকোথা থেকে এসেছে তা জেনে রাখা গুরুত্বপূর্ণ কারণ এটি একটি সংকেত হিসাবে ব্যবহৃত হলেও এটি ডেটার অংশও হতে পারে।
আপনি যখন কোনও অ্যাট্রিবিউটটির বৈশিষ্ট্যটির জন্য getattr(some_obj, 'attribute_name', None)ফিরে আসার সাথে জিজ্ঞাসা করছেন তখন আপনাকে Noneবলবে না যে আপনি যে বৈশিষ্ট্যটি অ্যাক্সেস করার চেষ্টা করছেন সেটি সেট করা হয়েছে Noneবা এটি কোনওভাবে অবজেক্ট থেকে অনুপস্থিত ছিল। অভিধান যেমন কোনও কী থেকে অ্যাক্সেস করার সময় একই অবস্থা some_dict.get('some_key'), আপনি জানেন না যে some_dict['some_key']অনুপস্থিত বা এটি সবেমাত্র সেট করা আছে None। আপনার যদি সেই তথ্যের প্রয়োজন হয় তবে এটিকে হ্যান্ডেল করার স্বাভাবিক উপায় হ'ল কোনও try/exceptনির্মাণের মধ্যে থেকে অ্যাট্রিবিউট বা কীটি সরাসরি অ্যাক্সেস করার চেষ্টা করা :
try:
# equivalent to getattr() without specifying a default
# value = getattr(some_obj, 'some_attribute')
value = some_obj.some_attribute
# now you handle `None` the data here
if value is None:
# do something here because the attribute was set to None
except AttributeError:
# we're now hanling the exceptional situation from here.
# We could assign None as a default value if required.
value = None
# In addition, since we now know that some_obj doesn't have the
# attribute 'some_attribute' we could do something about that.
log_something(some_obj)
একইভাবে ডিকের সাথে:
try:
value = some_dict['some_key']
if value is None:
# do something here because 'some_key' is set to None
except KeyError:
# set a default
value = None
# and do something because 'some_key' was missing
# from the dict.
log_something(some_dict)
উপরোক্ত দুটি উদাহরণ দেখায় যে কীভাবে অবজেক্ট এবং ডিকশনারি কেসগুলি পরিচালনা করতে হয়, ফাংশনগুলি সম্পর্কে কী বলা যায়? একই জিনিস, তবে আমরা সেই প্রান্তে ডাবল অ্যাসিরিস্টস কীওয়ার্ড আর্গুমেন্টটি ব্যবহার করি:
def my_function(**kwargs):
try:
value = kwargs['some_key']
if value is None:
# do something because 'some_key' is explicitly
# set to None
except KeyError:
# we assign the default
value = None
# and since it's not coming from the caller.
log_something('did not receive "some_key"')
None শুধুমাত্র একটি বৈধ মান হিসাবে ব্যবহৃতযদি আপনি দেখতে পান যে পতাকাগুলি এবং ডেটার try/exceptমধ্যে পার্থক্য করার জন্য আপনার কোডটি উপরের প্যাটার্ন দিয়ে খালি রয়েছে তবে কেবলমাত্র অন্য পরীক্ষার মানটি ব্যবহার করুন। এমন একটি প্যাটার্ন রয়েছে যেখানে বৈধ মানগুলির সেটের বাইরে থাকা কোনও মান একটি ডেটা স্ট্রাকচারে ডেটার অংশ হিসাবে সন্নিবেশ করা হয় এবং বিশেষ শর্তগুলি (যেমন সীমানা, রাজ্য, ইত্যাদি) নিয়ন্ত্রণ এবং পরীক্ষা করতে ব্যবহৃত হয়। এই জাতীয় মানকে একটি সেন্ডিনেল বলা হয় এবং এটি সিগন্যাল হিসাবে ব্যবহার করার পথে ব্যবহার করা যেতে পারে । পাইথনে সেন্ডিনেল তৈরি করা তুচ্ছ।NoneNoneNone
undefined = object()
undefinedবস্তুর উপরে অনন্য এবং আরো অনেক কিছু একটি প্রোগ্রাম সুদ হতে পারে না, এটা এইভাবে জন্য একটি চমৎকার প্রতিস্থাপন এর Noneএকটি পতাকা। কিছু সতর্কতা প্রয়োগ করা হয়, কোডের পরে সে সম্পর্কে আরও।
ফাংশন সহ
def my_function(value, param1=undefined, param2=undefined):
if param1 is undefined:
# we know nothing was passed to it, not even None
log_something('param1 was missing')
param1 = None
if param2 is undefined:
# we got nothing here either
log_something('param2 was missing')
param2 = None
ডিক দিয়ে
value = some_dict.get('some_key', undefined)
if value is None:
log_something("'some_key' was set to None")
if value is undefined:
# we know that the dict didn't have 'some_key'
log_something("'some_key' was not set at all")
value = None
একটি বস্তু সঙ্গে
value = getattr(obj, 'some_attribute', undefined)
if value is None:
log_something("'obj.some_attribute' was set to None")
if value is undefined:
# we know that there's no obj.some_attribute
log_something("no 'some_attribute' set on obj")
value = None
যেমনটি আমি আগে উল্লেখ করেছি কাস্টম সেন্ডিনেলগুলি কিছু ক্যাভ্যাট নিয়ে আসে। প্রথমত, তারা কীওয়ার্ড নয় None, তাই অজগর তাদের সুরক্ষা দেয় না। আপনি নিজের undefinedউপরের যে কোনও সময় যে কোনও সময় এটি সংজ্ঞায়িত মডিউলে যে কোনও জায়গায় ওভাররাইট করতে পারেন , সুতরাং কীভাবে আপনি তাদের প্রকাশ ও ব্যবহার করতে পারেন সে সম্পর্কে সতর্কতা অবলম্বন করুন। এরপরে, ফিরে আসা উদাহরণটি object()কোনও সিঙ্গলটন নয়, যদি আপনি এই কলটি 10 বার করেন তবে আপনি 10 টি বিভিন্ন বস্তু পেয়ে যাবেন। অবশেষে, একটি প্রেরণেলীর ব্যবহার অত্যন্ত আইডিসিঙ্ক্র্যাটিক। কোনও সেন্ডিনেল এটি ব্যবহৃত গ্রন্থাগারের সাথে সুনির্দিষ্ট এবং যেমন এর ব্যাপ্তিটি সাধারণত গ্রন্থাগারের অভ্যন্তরের মধ্যে সীমাবদ্ধ থাকে। এটি "ফুটো" আউট করা উচিত নয়। বাহ্যিক কোডগুলি কেবল এটি সম্পর্কে সচেতন হওয়া উচিত, যদি তাদের উদ্দেশ্য গ্রন্থাগারের এপিআই প্রসারিত বা পরিপূরক করা হয়।
এটিকে অন্যান্য ভাষাগুলির মতো নਾਲ বলা হয় না, তবে None। এই অবজেক্টের সবসময় কেবলমাত্র একটি উদাহরণ রয়েছে, তাই আপনি চাইলে x is Noneপরিবর্তে (পরিচয় তুলনা) এর সাথে সমতার জন্য পরীক্ষা x == Noneকরতে পারেন।
None। তারপরে যারা স্মার্ট লোকেরা তাদের তুলনা করেছেন NoneTypeতারা সবাই বিজয়ী হবেন!
পাইথন, একটি মান অভাবে প্রতিনিধিত্ব করার আপনি ব্যবহার করতে পারেন কোনটি মান ( types.NoneType.None অবজেক্টের জন্য) এবং "" (অথবা lên (0) == ) স্ট্রিং জন্য। অতএব:
if yourObject is None: # if yourObject == None:
...
if yourString == "": # if yourString.len() == 0:
...
"==" এবং "এর" মধ্যে পার্থক্য সম্পর্কে, "==" ব্যবহার করে অবজেক্টের পরিচয়ের জন্য পরীক্ষা করা যথেষ্ট হওয়া উচিত। তবে অপারেশনটি "যেহেতু" অবজেক্ট আইডেন্টিটি অপারেশন হিসাবে সংজ্ঞায়িত করা হয়েছে, তাই সম্ভবত এটি "==" না বলে এটি ব্যবহার করা আরও সঠিক। এমনকি গতির পার্থক্য আছে কিনা তা নিশ্চিত নয়।
যাইহোক, আপনি এক নজরে দেখতে পারেন:
0 == falseরিটার্নের কারণটি trueহ'ল ডাবল-ইকুয়াল অপারেটর টাইপের জবরদস্তি করে। ট্রিপল-ইক্যুয়াল অপারেটরের সাথে, তবে 0 === falseফেরত দেয় false, কারণ 'সংখ্যা' এবং 'বুলিয়ান' বিভিন্ন ধরণের।
trueশর্ত হিসাবে বিবেচনা করা হয়। মরিচা এবং গো, 0এবং false বিভিন্ন ধরণের যা সমতার জন্য তুলনা করা যায় না।
নাল একটি বিশেষ অবজেক্টের মতো:
>>>type(None)
<class 'NoneType'>
কোনও বস্তু 'ননটাইপ' শ্রেণিতে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন:
>>>variable = None
>>>variable is None
True
পাইথন ডক্সে আরও তথ্য পাওয়া যায়
প্রতি সত্য মান পরীক্ষামূলক , 'কিছুই নয়' সরাসরি মিথ্যা হিসাবে পরীক্ষা তাই সহজ অভিব্যক্তি চলা হবে:
if not foo:
Trueজন্য ফিরে আসবে , শুধু নয় । None
egg is Noneওভার বাছাইয়ের কারণegg == None: পরবর্তীটি ওভারলোড হওয়া যাবে এবং কোনওটির সাথে বৈধ বস্তুর তুলনা করার সময় ভেঙে পড়ার সম্ভাবনা রয়েছে (এটি কীভাবে কার্যকর হয় তার উপর নির্ভর করে, তবে আপনি সবাইকে বিবেচনায় না নিয়ে কারও সাথে তুলনা করা আশা করেন না, আপনি কি?) ,isসর্বদা একই কাজ করে।