2010-10-14 15 views
59

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

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

मैं इसे कैसे हल कर सकता हूं?

+5

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

+0

किसी भी तरह से मुझे एक गैर-प्रकार का मान मिला, यह एक int होना चाहिए, लेकिन अब यह एक गैर-वस्तु वस्तु है, और मुझे एक और संख्या विभाजित करने की आवश्यकता है, तो त्रुटि आई। – user469652

+0

'int (none) 'अपवाद फेंकता है क्योंकि किसी को भी int में परिवर्तित नहीं किया जा सकता है। आपके प्रश्न का उत्तर यह नहीं किया जा सकता है। आप कुछ, जैसे 0, या 2771, या गुलाबी हाथी को प्रतिस्थापित कर सकते हैं, लेकिन जो कुछ भी आप बदलते हैं, फिर भी आप किसी को भी int में कनवर्ट नहीं कर पाएंगे। – snapshoe

उत्तर

32

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

किसी तरह मैं एक Nonetype मूल्य, यह एक पूर्णांक होना चाहिए मिल गया है, लेकिन यह अब एक Nonetype वस्तु

यदि यह अपने कोड है, जब आप किसी संख्या की अपेक्षा करते हैं और को को होने से रोकते हैं तो आपको None मिल रहा है।

result = could_return_none(x) 

if result is None: 
    result = DEFAULT_VALUE 

... या यहाँ तक कि ...:

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

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 (यदि यह भी मौजूद है) पूरी तरह से आपके कोड के उद्देश्य पर निर्भर करता है।

+4

+1 शामिल है। यदि आपकी खिड़की अक्सर रहस्यमय रूप से टूट जाती है, तो खिड़की को अवरुद्ध करने के बजाए क्यों (और वांछित वंडल को जिम्मेदार ठहराएं); – delnan

+3

उदाहरण के लिए रेडिस डिक्शनरी से चाबियाँ पुनर्प्राप्त करने में यह उपयोगी नहीं है, क्योंकि गायब कुंजी होगी कोई नहीं। यदि आप उनकी मौजूदगी (जो पूरी तरह से स्वीकार्य व्यवहार है) पर ध्यान दिए बिना उन्हें जोड़ना चाहते हैं, तो आपको किसी को भी 0 में परिवर्तित करने की आवश्यकता हो सकती है (कृपया उत्तर दें) – spider

+1

@spider - इसका अभी भी मतलब है कि यह स्थिति पर अत्यधिक निर्भर है, और "एक समझदार निर्धारित करें मूल्य "अभी भी लागू होता है। – detly

10

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

+0

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

1

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

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

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

+1

आपको पहचान तुलना का उपयोग करना चाहिए ('नहीं [नहीं] कोई नहीं') – shylent

+0

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

+1

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

213
int(value or 0) 

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

int(0 if value is None else value) 

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

+47

उपयोगकर्ता 469652 आपको इसे इसके स्वीकृत उत्तर देने पर विचार करना चाहिए। यह वास्तव में उपयोगी है क्योंकि – galarant

+0

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

+1

इसलिए मुझे अपने कोड – br3w5

1

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

+1

... या फ़ंक्शन में एक या अधिक रिटर्न स्टेटमेंट हैं जो 'कुछ_expression' की बजाय केवल 'वापसी' हैं। –

+0

... या फ़ंक्शन में "दाएं" समाधान के लिए एक या अधिक 'वापसी कोई नहीं' कथन –

10

एक आम "pythonic" जिस तरह से स्थिति के इस प्रकार के लिए EAFPके रूप में जाना जाता है "यह अनुमति से माफी पूछने के लिए आसान है" को संभालने के लिए। जो आम तौर पर लिखने का मतलब है जो सबकुछ मानता है कि सबकुछ ठीक है, लेकिन फिर इसे 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 = my_value/divisor 
except TypeError: 
    answer = 0 

उलटा और अधिक परंपरागत दृष्टिकोण के रूप में जाना जाता है LBYL जो खड़ा है " को छलांग लगाने से पहले देखें" @ सोवियत और कुछ अन्य ने सुझाव दिया है। इस विषय के अतिरिक्त कवरेज के लिए मेरे answer और इस साइट पर अन्य जगह Determine whether a key is present in a dictionary पर संबंधित टिप्पणियां देखें।

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

1

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

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() 
2

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

संबंधित मुद्दे