ননোটাইপকে কীভাবে ইনট বা স্ট্রিংয়ে রূপান্তর করবেন?


99

আমি একটি Nonetypeমান পেয়েছি x, এটি সাধারণত একটি সংখ্যা, কিন্তু হতে পারে None। আমি এটি একটি সংখ্যায় বিভক্ত করতে চাই, তবে পাইথন উত্থাপন করেছে:

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

আমি কীভাবে এটি সমাধান করতে পারি?


4
ধরুন যে কোনওটিই 2771 এর সমতুল্য নয় But তবে সম্ভবত এটি আপনি চান তা নয়। আরও তথ্য দিন।
জোশডি

একরকম আমি একটি ননাইটাইপ মান পেয়েছি, এটি কোনও অন্তর্নিহিত হওয়ার কথা, তবে এটি এখন একটি ননটাইপ অবজেক্ট, এবং আমাকে অন্য একটি সংখ্যা বিভক্ত করতে হবে, তারপরে ত্রুটিটি এসেছিল।
ব্যবহারকারী469652

int(None)একটি ব্যতিক্রম ছুঁড়েছে কারণ কোনওটিই ইনট এ রূপান্তরিত হতে পারে না। আপনার প্রশ্নের উত্তর হ'ল এটি করা যায় না। আপনি 0, বা 2771, বা গোলাপী হাতি এর মতো কোনও কিছু প্রতিস্থাপন করতে পারেন তবে আপনি যা কিছু বিকল্প প্রতিস্থাপন করুন তা আপনি এখনও কোনওটিকেই কোনও int এ রূপান্তর করতে পারবেন না।
স্ন্যাপশো

7
@ ma3204 Noneগোলাপী হাতিতে রূপান্তর করাও ভাল নয়, যদি না আপনি কয়েকটি সংখ্যা পদ্ধতিতে কাজ করেন যা কোনও গোলাপী হাতির দ্বারা আনুষ্ঠানিকভাবে সংখ্যার বিভাজনকে সংজ্ঞায়িত করে (এবং আপনি এটির ব্যাক আপ করার জন্য কোডটি লিখেছেন)
অ্যারোনস্টার্লিং

উত্তর:


50

একটি মন্তব্যে আপনি বলেছেন:

একরকম আমি একটি ননটাইপ মান পেয়েছি, এটি কোনও অন্তর্নিহিত হওয়ার কথা, তবে এটি এখন একটি ননটাইপ অবজেক্ট

এটি যদি আপনার কোড হয় তবে 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(যদি এটা এমনকি বিদ্যমান) সম্পূর্ণরূপে আপনার কোড এর উদ্দেশ্য উপর নির্ভর করে।


4
"ডান" সমাধানের জন্য +1। যদি আপনার উইন্ডোটি প্রায়শই রহস্যজনকভাবে ভেঙে যায় তবে উইন্ডোটি আটকে দেওয়ার পরিবর্তে কেন (এবং কে দায়িত্বে

4
আপনি যদি redis অভিধান থেকে কীগুলি পুনরুদ্ধার করতে চান তবে এটি কার্যকর নয়, যেমন অনুপস্থিত কীগুলি কোনওটিই নয়। আপনি যদি তাদের উপস্থিতি নির্বিশেষে তাদের যোগফল দিতে চান (যা সম্পূর্ণ গ্রহণযোগ্য আচরণ), আপনার কোনওটিকে 0-এ রূপান্তর করতে হবে (উত্তরটি দেখুন)
স্পাইডার

4
@ স্পাইডার - এর অর্থ এখনও এটি পরিস্থিতির উপর নির্ভরশীল এবং "একটি বোধগম্য মান নির্ধারণ করুন" এখনও প্রযোজ্য।
স্পষ্টত

স্পাইডারের বক্তব্যটি এই উত্তরটির পক্ষে যথেষ্ট বৈধ, মূলত এটি বলে যে আপনি কিছু ভুল করেছেন, তবে এর অর্থ এই নয় যে এর অর্থ অজানা মান, এটি আপনাকে কোনও ভুল করেছে বা ইঙ্গিত করতে পারে যে মাকড়সা একটি অনুপস্থিত মান বলেছিল, সাধারণত এটি আসতে হবে 0 বা সম্ভবত 1, কোনওটির সম্ভাব্য ব্যবহারের জন্য যেখানে কোনও পূর্ণসংখ্যার আশা করা যায় না।
গ্লেন ফ্লেচার

@glenflet আপনার ফাংশনটির ইনপুট ডোমেন এবং স্পেসিফিকেশন কী তা আপনি যদি না জানেন তবে ইন্টারনেটে কোনও অপরিচিত ব্যক্তি আপনাকে বলতে সক্ষম হবেন না। আপনি যদি জানেন তবে এটি রূপান্তর করার বাক্য গঠনটি জানেন না, এটি এখানে জিজ্ঞাসা করা ব্যক্তির কাছে একেবারেই আলাদা প্রশ্ন।
যথাযথভাবে

318
int(value or 0)

এটি ক্ষেত্রে 0 ব্যবহার করবে যখন আপনি পাইথন বিবেচিত কোনও মান Falseযেমন যেমন কোনও নয়, 0, [], "", ইত্যাদি প্রদান করেন 0 যেহেতু 0 False, তাই আপনাকে কেবল 0 বিকল্প বিকল্প হিসাবে ব্যবহার করা উচিত (অন্যথায় আপনি আপনার 0 টি দেখতে পাবেন) যে মান রূপান্তর)।

int(0 if value is None else value)

এটি কেবল None০. এর সাথে প্রতিস্থাপন করে যেহেতু আমরা Noneবিশেষভাবে পরীক্ষা করে নিচ্ছি, আপনি প্রতিস্থাপন হিসাবে কিছু অন্যান্য মান ব্যবহার করতে পারেন।


65
user469652 এর পরিবর্তে আপনার এটি গ্রহণযোগ্য উত্তর দেওয়ার কথা বিবেচনা করা উচিত। এটি আসলে
ঘনীভবনের

আমি নিশ্চিত নই যে এটি সমস্যার সমাধান করে যদি ব্যবহারকারী মুখোমুখি হন। গণনা সম্পাদনের জন্য ননোটাইপটি ব্যবহার করুন ... আমি বর্তমানে বিশ্রাম এপিআইয়ের মাধ্যমে ডেটা টানছি যা একটি সংখ্যাসূচক মান সহ একটি ননটাইপ ফিরিয়ে দিচ্ছে। যদি আমি এটি 0 তে সেট করে
রেখেছি

4
প্রশ্নটি প্রদত্ত প্রশ্নটি উত্তর হিসাবে এটি সর্বোত্তম উত্তর, সম্ভবত কোনও ফাংশনের মতো কোনওটিই প্রত্যাশিত হওয়া উচিত নয়, প্রত্যাবর্তনকারী কোনও কিছুর মূল্য অনুরোধ করার জন্য কোনটিই মানটিকে চিহ্নিত করার জন্য অজানা, এই ক্ষেত্রে কোনওটিই ডিফল্ট মান হওয়া উচিত নয় এর ব্যবহারের ক্ষেত্রে, যা সাধারণত 0 হয় iz আইজিপ_লম্বকে, ডিফল্ট আর্গুমেন্টটি বিবেচনা করুন, এটির আলাদা আলাদা আলাদা ডিফল্ট (এমনকি টাইপ) থাকে তবে ডিফল্ট কোনওটিই হওয়া উচিত না তবে তারপরে স্ট্রিংয়ের সাথে কোনও ডিফল্ট দ্বারা প্রতিস্থাপন করা হয় <<তালিক_ন> (str, w) কেবল প্রস্থের জন্য একটি পূর্ণসংখ্যা নেয়।
গ্লেন ফ্লেচার

4
এটি ব্যবহৃত হয় এবং এটি মার্জিত এবং আমার সমস্যাগুলি সমাধান করে।
ড্যান সাফি 0

4
আমরা ব্যবহার করতে পারি (value or 0)- ইনট টাইপ কাস্টিং ব্যতীত - যদি আমরা আশ্বাস দিয়ে থাকি যে মানটি কেবলমাত্র কোনও বা কোনও
পূর্ববর্তী

17

এই ধরণের পরিস্থিতি পরিচালনা করার একটি সাধারণ "পাইথোনিক" উপায় "অনুমতিের চেয়ে ক্ষমা চাওয়া সহজ " এর জন্য ইএএফপি হিসাবে পরিচিত । যার অর্থ সাধারণত কোড লেখার অর্থ যা ধরে নিয়েছে যে সমস্ত কিছু ঠিক আছে, তবে তারপরে জিনিসগুলি হ্যান্ডেল করার জন্য এটি একটি ব্লক দিয়ে মোড়ানো — কেবলমাত্র ক্ষেত্রে — তা নয়।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

বিপরীত এবং আরও traditional তিহ্যবাহী পদ্ধতির নাম এলবিওয়াইএল হিসাবে পরিচিত যা "সোয়াইট এবং অন্যদের মধ্যে কেউ কেউ পরামর্শ দিয়েছেন" হ'ল আগে আপনি লাফানোর আগে দেখুন "। এই বিষয়টির অতিরিক্ত কভারেজের জন্য আমার উত্তর এবং প্রশ্নের সাথে সম্পর্কিত মন্তব্যগুলি দেখুন এই সাইটের অন্য কোনও অভিধানে একটি কী উপস্থিত রয়েছে কিনা তা নির্ধারণ করুন।

ইএএফপি-র একটি সম্ভাব্য সমস্যা হ'ল এটি আপনার কোডের বা অন্য কোনও তৃতীয় পক্ষের মডিউল ব্যবহার করছেন যা বিশেষত ব্যতিক্রমগুলি ঘন ঘন ঘটে (এবং তাই সত্যই "ব্যতিক্রমী" কেস হয় না এমন কিছু লুকিয়ে রাখতে পারে hide at all)।


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

আমি এই ধরণের ত্রুটির জন্য সফলভাবে ইন্ট (এক্স বা 0) ব্যবহার করেছি, যতক্ষণ না কারও পক্ষে যুক্তিতে 0 এর সমান হওয়া উচিত। নোট করুন যে এটি অন্যান্য ক্ষেত্রেও 0 এ সমাধান হবে যেখানে পরীক্ষার এক্স মিথ্যা ফিরিয়ে দেয়। যেমন খালি তালিকা, সেট, অভিধান বা শূন্য দৈর্ঘ্যের স্ট্রিং। দুঃখিত, কিন্ডাল ইতিমধ্যে এই উত্তরটি দিয়েছেন।


1

আপনি যদি কোনও ফাংশন থেকে কোনও মান ফিরিয়ে দিতে ভুলে যান তবে এটি ঘটতে পারে: এরপরে কোনও কিছুই ফেরায় না। আপনি যে স্থানে সেই ভেরিয়েবলটি অর্পণ করছেন সেই সমস্ত জায়গাগুলি দেখুন এবং দেখুন যেগুলির মধ্যে একটির একটি ফাংশন কল রয়েছে যেখানে ফাংশনটিতে রিটার্নের বিবৃতি নেই।


4
... অথবা ফাংশনটিতে এক বা একাধিক রিটার্ন স্টেটমেন্ট রয়েছে যা কেবল returnপরিবর্তে সরল return some_expression
জন মাচিন

... বা ফাংশনটিতে এক বা একাধিক return Noneবক্তব্য রয়েছে
জন মাচিন

1

আপনার কোনও হিসাব করার চেষ্টা করার আগে মানটি কোনওটি নয় তা নিশ্চিত করার জন্য আপনার পরীক্ষা করা উচিত :

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

দ্রষ্টব্য: my_value কোডটি কাজ করে এবং চেকটি সম্পন্ন হচ্ছে তা প্রমাণ করার জন্য ইচ্ছাকৃতভাবে কোনওটিতে সেট করা হয়েছিল।


4
আপনার পরিচয় তুলনাটি ব্যবহার করা উচিত ( is [not] None)
শাইলেন্ট

-4 আপনার আসল সমস্যাটি এড়ানোর পরিবর্তে এটি কী তা খুঁজে পেতে ওপিকে উত্সাহিত করা উচিত। @ শাইলেন্ট কী বলেছে। আপনি my_valueনিঃশর্তভাবে কারও কাছে সেট করেননি; কেন? আপনি প্রশ্ন কেন ওপি মনে করে সে কাজ অনুযায়ী না int(my_value)যখন my_value(যদি না কেউ) "সাধারণত একটি সংখ্যা" হয়।
জন মাচিন

4
আমার কোডটি ব্যর্থ হয় না তা দেখানোর জন্য, আমি ধারণার প্রমাণ হিসাবে কারও কাছে আমার_মূল্য সেট করি। আমি ওপিকে প্রশ্ন করিনি কারণ অনেক কারণেই কেন মান সর্বদা একটি সংখ্যক হতে পারে না এবং এটি গণনা করার আগে যাচাই করা ভাল ধারণা। ওপি-র প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে কোনও ভুল নেই, তাদের জন্য আমার সমস্ত বাড়ির কাজ আমাকে করতে হবে না।
সোভিয়েট

1

পাইথন ইমেল ফাংশনগুলি ব্যবহার করে আমার একই সমস্যা হয়েছিল। নীচে কোডটি আমি ভেরিয়েবলের মধ্যে ইমেল বিষয় পুনরুদ্ধার করার চেষ্টা করছিলাম। এটি বেশিরভাগ ইমেল এবং ভেরিয়েবল পপুলেটের জন্য দুর্দান্ত কাজ করে। আপনি যদি ইয়াহু বা এই জাতীয় কোনও ইমেল পান এবং প্রেরক সাবজেক্ট লাইনটি পূরণ করেন নি ইয়াহু ইমেইলে একটি বিষয় লাইন তৈরি করে না এবং আপনি কোনও ননটাইপ ফাংশন থেকে ফিরে পেয়েছেন। মার্টিনো সোভিয়েটের পাশাপাশি একটি সঠিক উত্তর সরবরাহ করেছিল। আইএমও সোভিয়েতের উত্তর একটি প্রোগ্রামিং স্ট্যান্ড পয়েন্ট থেকে আরও সংক্ষিপ্ত; অজগর থেকে অগত্যা নয়। কৌশলটি দেখানোর জন্য এখানে কিছু কোড দেওয়া হয়েছে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.