'NoType' ऑब्जेक्ट क्या है?


89

जब मैं अपनी अजगर स्क्रिप्ट चलाता हूं तो मुझे यह त्रुटि मिल रही है:

TypeError: cannot concatenate 'str' and 'NoneType' objects

मुझे पूरा यकीन है कि 'str' का अर्थ स्ट्रिंग है, लेकिन मुझे नहीं पता कि कोई 'AnyType' ऑब्जेक्ट क्या है। मेरी स्क्रिप्ट दूसरी पंक्ति पर क्रिप्ट करती है, मैं पहले एक काम को जानता हूं क्योंकि उस लाइन से कमांड मेरे आसा में हैं जैसा कि मैं उम्मीद करूंगा। पहले मुझे लगा कि ऐसा हो सकता है क्योंकि मैं send_command के अंदर वैरिएबल और उपयोगकर्ता इनपुट का उपयोग कर रहा हूं।

'CAPS' में सब कुछ वैरिएबल है, 'लोअर केस' में सब कुछ 'parser.add_option' विकल्पों से इनपुट है।

मैं pexpect, और Optparse का उपयोग कर रहा हूं

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)

2
हमें और अधिक कोड और इनपुट देखने की आवश्यकता है - कोई नहीं टेटेओ का मतलब है कि चर में से एक सेट नहीं किया गया है
mmmmmm

3
NoneTypeसिंगलटन मान का प्रकार है None। आपका एक मान स्ट्रिंग नहीं है।
मार्टिन पीटर्स

त्वरित और गंदा: प्रत्येक शब्द को str()str (SNMPSRVUSRCMD) + str (स्नैम्पसर) + ...
पीटरमम

2
@PeterMmm यह एक भयानक विचार है - समस्या बस आगे (शायद बदतर) रेखा के नीचे प्रकट होगी। यह पता लगाना बेहतर होगा कि चर में से कोई भी क्यों नहीं है।
अर्शजी १३'१४

जवाबों:


83

NoneTypeNoneऑब्जेक्ट के लिए प्रकार है , जो एक ऐसी वस्तु है जो बिना मूल्य के इंगित करता है । Noneफ़ंक्शन का रिटर्न मान है कि "कुछ भी वापस न करें"। यह फ़ंक्शंस के लिए एक सामान्य डिफ़ॉल्ट रिटर्न वैल्यू है जो किसी चीज़ की खोज करता है और उसे खोज सकता है या नहीं; उदाहरण के लिए, यह re.searchतब तक वापस आ जाता है जब रेगेक्स मेल नहीं खाता, या dict.getजब कुंजी की हुक में कोई प्रविष्टि नहीं होती है। आप Noneतार या अन्य वस्तुओं में नहीं जोड़ सकते ।

आपका एक चर Noneएक स्ट्रिंग नहीं है। हो सकता है कि आप returnअपने किसी कार्य में भूल गए हों , या हो सकता है कि उपयोगकर्ता ने कमांड-लाइन विकल्प प्रदान न किया हो और optparseआपको Noneउस विकल्प के मूल्य के लिए दिया हो । जब आप Noneएक स्ट्रिंग में जोड़ने की कोशिश करते हैं , तो आपको वह अपवाद मिलता है:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

में से एक groupया SNMPGROUPCMDया V3PRIVCMDहै Noneअपने मूल्य के रूप में।


धन्यवाद!! जहां आप सही हैं, मेरे उपयोगकर्ता इनपुट विकल्पों में से एक किसी कारण से नहीं ले रहा था। मैंने इसे एक "नाम" बनाम एक विकल्प और उछाल के रूप में जोड़ा, यह काम किया। अब मुझे सिर्फ यह पता लगाना है कि यह एक विकल्प के रूप में ठीक से क्यों नहीं ले रहा है, अन्य सभी विकल्प ठीक काम कर रहे हैं।
असुरक्षित आईटी

1
"सेट नहीं" थोड़ा अस्पष्ट है ... यदि एक चर को परिभाषित नहीं किया गया है और आप इसके साथ कुछ ऑपरेशन करने की कोशिश करते हैं, तो आपको मिलना चाहिए NameError। यह भी सेट किया जा सकता है, लेकिन इसके बराबर None("सेट टू नथिंग" = "सेट नहीं"?), तो आपको कुछ मिल सकता है TypeError
निक टी। टी।

मूल रूप से (सी / जावा के लोगों के लिए यहां) कोई नहीं = अशक्त
ज़ो

24

NoneTypeबस Noneसिंगलटन का प्रकार है :

>>> type(None)
<type 'NoneType'>

ऊपर दिए गए बाद के लिंक से:

None

प्रकार का एकमात्र मूल्य NoneTypeNoneएक मूल्य की अनुपस्थिति का प्रतिनिधित्व करने के लिए अक्सर उपयोग किया जाता है, जब किसी फ़ंक्शन को डिफ़ॉल्ट तर्क पास नहीं किया जाता है। असाइनमेंट Noneअवैध हैं और ए बढ़ाएं SyntaxError

आपके मामले में, यह उन वस्तुओं में से एक जैसा दिखता है जिन्हें आप समेटने की कोशिश कर रहे हैं None, इसलिए आपकी त्रुटि है।


21

रक्षात्मक प्रोग्रामिंग के लिए, उपयोग करने से पहले वस्तुओं को अशक्तता के खिलाफ जांचना चाहिए।

if obj is None:

या

if obj is not None:

2
"है" का उपयोग केवल तभी किया जाना चाहिए जब आपको इसकी आवश्यकता हो। सबसे रक्षात्मक प्रोग्रामिंग परीक्षण है, बहुत सारे परीक्षण।
जुरगेन ए। इरहार्ड

2
रक्षात्मक प्रोग्रामिंग सबसे बुरी चीजों में से एक है। यदि आपको कोई त्रुटि मिलती है, तो इसका मतलब है कि आपने एक गलती प्रोग्रामिंग की है। "उपयोग करने से पहले अशक्त के लिए जाँच" जैसी सामग्री केवल कुछ गंभीर त्रुटि को छुपाती है। आपको अपवाद को फेंकने देना चाहिए। और प्रोग्रामर कुछ कस्टम अपवाद फेंक मत करो, यह वास्तव में बोझिल है। प्राकृतिक त्रुटि को फेंक दिया जाए। वास्तव में, रक्षात्मक प्रोग्रामिंग एक लक्षण है जिसे आपको किसी अन्य भाषा का उपयोग करना चाहिए।
bzim

1
मैं sqlAlchemy के माध्यम से डेटाबेस को क्वेरी करता हूं। कोई नतीजा नहीं निकला। लौटी हुई वस्तु कोई नहीं है। जिसका कोई अर्थ नहीं है। कोई त्रुटि नहीं है। आप जाँचते हैं कि कोई परिणाम नहीं है, यदि नहीं, तो आप परिणाम ऑब्जेक्ट का उपयोग करते हैं। इसके बारे में कुछ भी बुराई नहीं है। प्रोग्रामिंग के बारे में सबसे बुरी बात हठधर्मिता है।
100 पर यूनिटी 100

17

इसका मतलब है कि आप किसी चीज के साथ एक स्ट्रिंग को बदलने की कोशिश कर रहे हैं None

कोई भी अजगर का "अशक्त" नहीं है, और NoneTypeइसका प्रकार है।

यह कोड उसी तरह की त्रुटि उठाएगा:

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


2

त्रुटि संदेश में, आपको यह बताने के बजाय कि आप दो ऑब्जेक्ट्स को उनके मान (एक स्ट्रिंग और Noneइस उदाहरण में) दिखा कर संक्षिप्त नहीं कर सकते हैं , पायथन दुभाषिया आपको यह बताने के लिए कहता है कि आपने ऑब्जेक्ट के प्रकारों को दर्शाया है। प्रत्येक स्ट्रिंग का strप्रकार है, जबकि एकल Noneउदाहरण का प्रकार कहा जाता है NoneType

आपको आम तौर पर अपने आप से चिंतित होने की आवश्यकता नहीं है NoneType, लेकिन इस उदाहरण में यह जानना आवश्यक है type(None) == NoneType


मुझे एक समान समस्या है और यह पता लगाने की कोशिश की जा रही है कि वस्तु कोई नहीं है, आपकी पुष्टि मेरे लिए काम नहीं करती है: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK

2
@RuBiCK NoneTypeकहीं भी परिभाषित नहीं है (कि मुझे पता है)। यदि आप यह जांचना चाहते हैं कि क्या मान है None, तो बस उपयोग करें key is None(देखें stackoverflow.com/questions/23086383/… )। अन्यथा आप type(key) == type(None)उसी प्रभाव का उपयोग कर सकते हैं ।
फ्युएर्मुरमेल

1

आपकी त्रुटि कुछ इस तरह से होने के कारण है: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

पायथन की कोई भी वस्तु अन्य भाषाओं में अशक्त , शून्य आदि के बराबर नहीं है


0

चर में से कोई भी मूल्य नहीं दिया गया है, इस प्रकार यह एक NoType है। आपको यह देखना होगा कि ऐसा क्यों है, यह संभवतः आपकी ओर से एक साधारण तर्क त्रुटि है।


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