जवाबों:
पायथन में, 'नल' ऑब्जेक्ट सिंगलटन है None
।
"Noneness" के लिए चीजों की जांच करने का सबसे अच्छा तरीका पहचानकर्ता का उपयोग करना है is
:
if foo is None:
...
None
, पायथन का अशक्त?null
इसके बजाय पाइथन में कोई नहीं है None
। जैसा कि पहले से ही परीक्षण का सबसे सटीक तरीका बताया गया है None
कि मूल्य के रूप में कुछ दिया गया है, is
पहचान ऑपरेटर का उपयोग करना है, जो परीक्षण करता है कि दो चर एक ही वस्तु को संदर्भित करते हैं।
>>> foo is None
True
>>> foo = 'bar'
>>> foo is None
False
None
None
वर्ग का एकमात्र उदाहरण है 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
ओवरराइट नहीं किया जा सकता हैपायथन के बहुत पुराने संस्करण में (2.4 से पहले) यह फिर से असाइन करना संभव था 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
जब कोड लिखना आपको इस तरह से Noneness के लिए परीक्षण करने के लिए परीक्षा दे सकता है :
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
बीच अंतर करने के लिए बस उपरोक्त पैटर्न से भरा हुआ है , तो बस एक और परीक्षण मान का उपयोग करें। एक ऐसा पैटर्न है जहां एक मान जो मान्य मानों के सेट के बाहर आता है, उसे डेटा संरचना में डेटा के हिस्से के रूप में डाला जाता है और इसका उपयोग विशेष परिस्थितियों (जैसे सीमाओं, राज्य, आदि) को नियंत्रित और परीक्षण करने के लिए किया जाता है। इस तरह के मूल्य को एक प्रहरी कहा जाता है और इसका उपयोग सिग्नल के रूप में जिस तरह से किया जाता है उसका उपयोग किया जा सकता है। यह पायथन में एक प्रहरी बनाने के लिए तुच्छ है।None
None
None
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
जीत जाएगा!
पायथन में, एक मूल्य की अनुपस्थिति का प्रतिनिधित्व करने के लिए, आप स्ट्रिंग के लिए ऑब्जेक्ट्स और "" (या लेन () == 0 ) के लिए कोई भी मान ( type.NoneType.None ) का उपयोग कर सकते हैं । इसलिए:
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
अधिक जानकारी पायथन डॉक्स पर उपलब्ध है
प्रति सत्य मूल्य परीक्षण , 'कोई नहीं' सीधे, FALSE के रूप में परीक्षण इतना सरल अभिव्यक्ति पर्याप्त होगा:
if not foo:
True
लिए वापस आ जाएगी , न कि सिर्फ । None
egg is None
से अधिकegg == None
: उत्तरार्द्ध अतिभारित किया जा सकता है, और जब कोई नहीं के साथ मान्य वस्तु की तुलना तोड़ने की संभावना है (यह कैसे लागू हो जाता है पर निर्भर करता है, लेकिन आप हर किसी के खाते में कोई भी साथ comparisions लेने के लिए की उम्मीद नहीं है, है न?) , जबकिis
हमेशा एक ही काम करता है।