Nonetype को int या string में कैसे बदलें?


95

मुझे एक Nonetypeमूल्य मिला है x, यह आम तौर पर एक संख्या है, लेकिन हो सकता है None। मैं इसे एक संख्या से विभाजित करना चाहता हूं, लेकिन पायथन उठाता है:

TypeError: int() argument must be a string or a number, not 'NoneType'

इसे कैसे हल किया जा सकता है?


5
मान लें कि कोई भी 2771 के बराबर नहीं है। लेकिन शायद वह नहीं है जो आप चाहते हैं। कृपया और जानकारी दें।
— जोश

किसी तरह मुझे एक नॉनटाइप मूल्य मिला, यह एक इंट माना जाता था, लेकिन अब यह एक नॉनटाइप ऑब्जेक्ट है, और मुझे दूसरे नंबर को विभाजित करने की आवश्यकता है, फिर त्रुटि आई।
— user469652

int(None)एक अपवाद को फेंकता है क्योंकि कोई भी एक इंट में परिवर्तित नहीं किया जा सकता है। आपके सवाल का जवाब यह नहीं किया जा सकता है। आप 0, या 2771, या एक गुलाबी हाथी की तरह कुछ भी स्थानापन्न कर सकते हैं, लेकिन आप जो भी विकल्प देते हैं, आप अभी भी किसी को भी इंट में बदलने में सक्षम नहीं होंगे।
— स्नैपशॉट

7
@ ma3204। Noneएक गुलाबी हाथी में परिवर्तित करना या तो अच्छा नहीं है, जब तक कि आप कुछ संख्या प्रणाली पर काम नहीं कर रहे हैं जो औपचारिक रूप से एक गुलाबी हाथी द्वारा संख्या के विभाजन को परिभाषित करता है (और आपने इसे वापस करने के लिए कोड लिखा है)
— aaronasterling

जवाबों:


48

टिप्पणियों में से एक में, आप कहते हैं:

किसी तरह मुझे एक Nonetype मूल्य मिला, यह एक इंट माना जाता है, लेकिन अब यह एक Nonetype ऑब्जेक्ट है

यदि यह आपका कोड है, तो यह पता करें कि Noneजब आप एक नंबर की उम्मीद कर रहे हैं तो आप कैसे हो रहे हैं और ऐसा होने से रोकें ।

यदि यह किसी और का कोड है, Noneतो सामान्य नियम कोड के साथ, इसके लिए उपयोग की जाने वाली शर्तों का पता लगाएं और इसके लिए एक समझदार मूल्य निर्धारित करें।

result = could_return_none(x)

if result is None:
    result = DEFAULT_VALUE

...या और भी...

if x == THING_THAT_RESULTS_IN_NONE:
    result = DEFAULT_VALUE
else:
    result = could_return_none(x) # But it won't return None, because we've restricted the domain.

स्वचालित रूप से 0यहां उपयोग करने का कोई कारण नहीं है - समाधान जो "झूठा"-निर्भरता पर निर्भर करते हैं कि Noneआप यह चाहते हैं। DEFAULT_VALUE(अगर यह भी मौजूद है) पूरी तरह से अपने कोड का उद्देश्य पर निर्भर करता है।


5
"सही" समाधान के लिए +1। यदि आपकी खिड़की अक्सर रहस्यमय तरीके से टूट जाती है, तो पता लगाएँ कि क्यों (और उस बर्बर को पकड़ना है जो ज़िम्मेदार है) खिड़की को बंद करने के बजाय।)

3
यह उपयोगी नहीं है जब आप उदाहरण के लिए एक रेडिस शब्दकोश से कुंजियों को पुनः प्राप्त कर रहे हैं, क्योंकि लापता कुंजी कोई नहीं होगी। यदि आप उनकी उपस्थिति की परवाह किए बिना उन्हें सम्‍मिलित करना चाहते हैं (जो पूरी तरह स्‍वीकार्य व्‍यवहार है), तो आपको किसी को भी 0 में परिवर्तित करने की आवश्‍यकता नहीं पड़ सकती है (किन्‍नद उत्‍तर देखें)
— मकड़ी

1
@ स्पाइडर - इसका मतलब है कि यह अभी भी स्थिति पर बहुत निर्भर है, और "एक समझदार मूल्य निर्धारित करता है" अभी भी लागू होता है।
— 21

स्पाइडर की बात काफी मान्य है, यह उत्तर मूल रूप से बस कहता है कि आपने कुछ गलत किया है, लेकिन इसका कोई मतलब नहीं है कि इसका मतलब अज्ञात मूल्य है, जो आपको संकेत दे सकता है कि आपने कुछ गलत किया है, या जैसा कि मकड़ी ने एक लापता मूल्य का सुझाव दिया है, सामान्य तौर पर इसे 0 आना चाहिए। या संभवत: 1, जहां कोई पूर्णांक अपेक्षित नहीं है, के अधिकांश संभावित उपयोगों के लिए।
— ग्लेन फ्लेचर

@glenflet यदि आप नहीं जानते कि आपके फ़ंक्शन का इनपुट डोमेन और विनिर्देश क्या है, तो इंटरनेट पर एक अजनबी आपको बताने में सक्षम नहीं है। यदि आप जानते हैं, लेकिन इसे बदलने के लिए वाक्यविन्यास नहीं जानते हैं, तो यह यहाँ पूछे जाने वाले एक पूरी तरह से अलग सवाल है।
— detly

310
int(value or 0)

यह 0 का उपयोग उस स्थिति में करेगा जब आप कोई ऐसा मूल्य प्रदान करते हैं False, जिसे पायथन मानता है , जैसे कि कोई नहीं, 0, [], "", आदि। चूंकि 0 है False, आपको केवल 0 को वैकल्पिक मान के रूप में उपयोग करना चाहिए (अन्यथा आप अपना 0s पाएंगे। उस मूल्य में बदल)।

int(0 if value is None else value)

यह केवल None0. के साथ बदलता है क्योंकि हम Noneविशेष रूप से परीक्षण कर रहे हैं , आप प्रतिस्थापन के रूप में कुछ अन्य मूल्य का उपयोग कर सकते हैं।


64
user469652 आपको इसके बजाय स्वीकृत उत्तर बनाने पर विचार करना चाहिए। यह वास्तव में सहायक के रूप में कृपालु के विपरीत है
— गैलेंट

मुझे यकीन नहीं है कि अगर यह उस समस्या को हल करता है जो उपयोगकर्ता का सामना कर रहा है। गणना करने के लिए nonetype का उपयोग करें ... मैं वर्तमान में बाकी api के माध्यम से डेटा खींच रहा हूं जो कि एक nonetype को संख्यात्मक मान से वापस कर रहा है। अगर मैं इसे 0 पर सेट करता हूँ या इसे छोड़ देता हूँ तो यह है कि मैं इसके साथ कुछ नहीं कर सकता हूँ
— br3w5

2
यह सबसे अच्छा उत्तर है, इस प्रश्न को देखते हुए, जैसा कि उपयोगकर्ता इंगित करता है कि किसी को भी उम्मीद नहीं की जानी चाहिए, संभवतः एक फ़ंक्शन की तरह, किसी चीज़ के मूल्य का अनुरोध करने वाला कोई भी नहीं लौटने का संकेत करने के लिए मूल्य अज्ञात है यह इस मामले में कोई भी डिफ़ॉल्ट मान नहीं होना चाहिए। इसके उपयोग के मामले में, जो आमतौर पर 0. माना जाएगा izip_longest, डिफ़ॉल्ट तर्क, यह अलग है एक अलग डिफ़ॉल्ट (यहां तक ​​कि प्रकार) है, फिर डिफ़ॉल्ट कोई भी नहीं होना चाहिए जो तब डिफ़ॉल्ट, लेकिन स्ट्रिंग के साथ प्रतिस्थापित किया जाता है। <align_n> (str, w) केवल चौड़ाई के लिए एक पूर्णांक लेता है।
— ग्लेन फ्लेचर

2
इसका इस्तेमाल किया और यह सुरुचिपूर्ण था और मेरी समस्याओं को हल किया।
— दान साफी

1
हम (value or 0)इंट-टाइप कास्टिंग के बिना - का उपयोग कर सकते हैं - अगर हमने आश्वासन दिया है कि मूल्य केवल कोई भी नहीं हो सकता है या एक इंट
— हैशलैश

16

इस तरह की स्थिति को संभालने के लिए एक सामान्य "पायथोनिक" रास्ता ईएएफपी के रूप में जाना जाता है , " अनुमति की तुलना में माफी मांगना आसान है "। आमतौर पर कोड लिखने का मतलब है कि सबकुछ ठीक है, लेकिन तब try..exceptचीजों को संभालने के लिए इसे ब्लॉक के साथ लपेटना जब यह नहीं है।

यहाँ है कि कोडिंग शैली आपकी समस्या पर लागू होती है:

try:
    my_value = int(my_value)
except TypeError:
    my_value = 0  # or whatever you want to do

answer = my_value / divisor

या शायद और भी सरल और थोड़ा तेज:

try:
    answer = int(my_value) / divisor
except TypeError:
    answer = 0

व्युत्क्रम और अधिक पारंपरिक दृष्टिकोण को LBYL के रूप में जाना जाता है जो " छलांग लगाने से पहले देखो " के लिए खड़ा है जो @Soviut और कुछ अन्य ने सुझाव दिया है। इस विषय के अतिरिक्त कवरेज के लिए मेरे उत्तर और संबंधित टिप्पणियों को प्रश्न पर देखें कि क्या कोई कुंजी इस साइट पर कहीं और शब्दकोश में मौजूद है ।

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


11

यह TypeErrorकेवल तब प्रकट होता है जब आप पास होने का प्रयास करते हैं int() None(जो कि एकमात्र NoneTypeमूल्य है, जहां तक ​​मुझे पता है)। मैं यह कहूंगा कि आपका वास्तविक लक्ष्य रूपांतरित NoneTypeहोना intया होना नहीं होना चाहिए str, बल्कि यह पता लगाना है कि आपको Noneअपेक्षित संख्या के बजाय कहां / क्यों मिल रहा है, या तो इसे ठीक करें या ठीक से संभाल लें None।


पासिंग int()के रूप में एक जटिल संख्या, int(1+2j), यह भी एक कारण होगा TypeError, उठाया जा हालांकि वैसे शायद बहुत संभावना नहीं है कि। भले ही, मुझे लगता है कि आप कहेंगे, सवाल के बिना, आमतौर पर पालन करने के लिए अच्छी सलाह।
— मार्टिन

5

पायथन 3 में आप "या" कीवर्ड का भी उपयोग कर सकते हैं। इस तरफ:

foo = bar or 0
foo2 = bar or ""

2

मैंने इस प्रकार की त्रुटि के लिए int (x या 0) का सफलतापूर्वक उपयोग किया है, इसलिए जब तक किसी को तर्क में 0 के बराबर नहीं होना चाहिए। ध्यान दें कि यह अन्य मामलों में 0 का भी समाधान करेगा जहां x का परीक्षण करना गलत है। उदाहरण के लिए खाली सूची, सेट, शब्दकोश या शून्य लंबाई स्ट्रिंग। क्षमा करें, Kindall ने पहले ही यह जवाब दे दिया है।


1

यह तब हो सकता है जब आप किसी फ़ंक्शन से मान वापस करना भूल जाते हैं: यह तब कोई नहीं लौटाता है। उन सभी स्थानों को देखें जहां आप उस चर को असाइन कर रहे हैं, और देखें कि उनमें से एक फ़ंक्शन कॉल है जहां फ़ंक्शन में रिटर्न स्टेटमेंट का अभाव है।


1
... या फ़ंक्शन में एक या एक से अधिक रिटर्न स्टेटमेंट हैं जो returnइसके बजाय केवल सादे हैं return some_expression।
— जॉन माकिन

... या समारोह में एक या अधिक return Noneकथन शामिल हैं
— जॉन माकिन

1

आपको यह सुनिश्चित करने के लिए जांचना चाहिए कि इस पर कोई गणना करने की कोशिश करने से पहले मूल्य कोई भी नहीं है:

my_value = None
if my_value is not None:
    print int(my_value) / 2

नोट: my_value कोड कार्यों को सिद्ध करने के लिए जानबूझकर किसी को भी सेट नहीं किया गया था और चेक का प्रदर्शन किया जा रहा है।


1
आपको पहचान तुलना ( is [not] None)
— shylent

-4 आपको ओपी को यह पता लगाने के लिए प्रोत्साहित करना चाहिए कि उसकी वास्तविक समस्या क्या है, बजाय इससे बचने के। क्या @shylent ने कहा। आप my_valueबिना शर्त किसी को भी सेट करते हैं ; क्यों? आप सवाल नहीं क्यों ओ पी सोचता है कि वह क्या करने की जरूरत है int(my_value)जब my_value(यदि नहीं कोई नहीं) "आम तौर पर एक नंबर है।"
— जॉन माकिन

1
मैंने अपना कोड अवधारणा के प्रमाण के रूप में my_value को सेट किया, यह दिखाने के लिए कि मेरा कोड विफल नहीं है। मैंने ओपी पर सवाल नहीं उठाया क्योंकि कई कारण हैं कि एक मूल्य हमेशा एक संख्या नहीं हो सकता है और यह जांचना कि गणना करने से पहले यह एक अच्छा विचार है। ओपी के सवाल का जवाब देने में कुछ भी गलत नहीं है, मुझे उनके लिए अपना सारा होमवर्क नहीं करना है।
— सोवियुत

1

मुझे अजगर ईमेल फ़ंक्शन का उपयोग करने में समान समस्या हो रही थी। नीचे वह कोड है जिसे मैं एक चर में ईमेल विषय को पुनः प्राप्त करने की कोशिश कर रहा था। यह अधिकांश ईमेल के लिए ठीक काम करता है और चर आबाद करता है। यदि आपको याहू या उसके जैसी ईमेल मिलती है और भेजने वाले ने सब्जेक्ट लाइन नहीं भरी है, तो याहू ईमेल में सब्जेक्ट लाइन नहीं बनाता है और आपको फंक्शन से लौटा हुआ कोई नहीं मिल सकता है। मार्टिनोउ ने एक सही उत्तर दिया और साथ ही सोवियत भी। IMO सोवियुत का उत्तर प्रोग्रामिंग स्टैंड पॉइंट से अधिक संक्षिप्त है; जरूरी नहीं कि एक पायथन से। तकनीक को दिखाने के लिए यहां कुछ कोड दिए गए हैं:

import sys, email, email.Utils 

afile = open(sys.argv[1], 'r')    
m = email.message_from_file(afile)    
subject = m["subject"]

# Soviut's Concise test for unset variable.

if subject is None:    
     subject = "[NO SUBJECT]"

# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)

try:    
    if len(subject) == 0:    
        subject = "[NO SUBJECT]"

except TypeError:    
    subject = "[NO SUBJECT]"

print subject

afile.close()

1

कुछ स्थितियों में किसी को भी शून्य में बदलने के लिए फ़ंक्शन का होना सहायक होता है:

def nz(value):

    '''
    Convert None to int zero else return value.
    '''

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