পাইথনে কীভাবে আমার পরীক্ষা করা উচিত যদি কোনও ভেরিয়েবল কিছুই না হয়, সত্য বা মিথ্যা


146

আমার একটি ফাংশন রয়েছে যা তিনটি জিনিসের মধ্যে একটি ফেরত দিতে পারে:

  • সাফল্য ( True)
  • ব্যর্থতা ( False)
  • স্ট্রিম পড়ার / পার্সিংয়ে ত্রুটি ( None)

আমার প্রশ্ন হ'ল, যদি আমার বিরুদ্ধে পরীক্ষা করার কথা না হয় Trueবা হয় False, ফলাফল কী হয় তা আমার কীভাবে দেখা উচিত। নীচে আমি বর্তমানে এটি কীভাবে করছি:

result = simulate(open("myfile"))
if result == None:
    print "error parsing stream"
elif result == True: # shouldn't do this
    print "result pass"
else:
    print "result fail"

== Trueঅংশটি অপসারণ করার মতো এটি কি আসলেই সহজ বা আমার ত্রি-বুল ডেটা টাইপ যুক্ত করা উচিত? আমি চাই না যে simulateফাংশনটি একটি ব্যতিক্রম ছুঁড়ে ফেলুক আমি যেমন একটি বহিরাগত প্রোগ্রামটি ত্রুটির সাথে করতে চাই তা লগইন করা এবং চালিয়ে যাওয়া।


আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন; আপনার ফলাফলটি সংজ্ঞায়িত করার জন্য আপনার কাছে সাহায্য চাওয়া উচিত ... আপনি "ব্যর্থতা" এবং "ত্রুটি পার্সিং স্ট্রিম" এর মধ্যে পার্থক্য কী তা বোঝাতে পারেন, তার অর্থ কী, পরিণতিগুলি কী, আহ্বানকারী কী পদক্ষেপ নিতে চান প্রতিটি ক্ষেত্রে (পাস, ব্যর্থ, পার্স ত্রুটি)?
জন মাচিন

আমি একটি বৈদ্যুতিক বিদ্যুত্ সিস্টেমের অনুকরণ করছি, যদি লোকেরা তাদের বাড়িতে বিদ্যুৎ হারিয়ে ফেলেন তবে এটি ব্যর্থ। যদি আমি সিমুলেশন ফাইলটি পড়তে না পারি তবে এটি সম্পূর্ণ ভিন্ন ধরণের একটি ত্রুটি।
জেমস ব্রুকস

2
simulateফাংশনের ভিতরে আমি সমস্ত ব্যতিক্রম ধরা; প্রোগ্রামটি বাকি থাকা (এবং পরবর্তী উপাদানটি প্রক্রিয়াজাতকরণ) বন্ধ করতে আমি সিমুলেটারের অভ্যন্তরে এমন কিছু চাই না। কিন্তু উত্তরগুলি আমাকে আমার মন পরিবর্তন করতে বাধ্য করছে।
জেমস ব্রুকস 15

1
@ জামেস ব্রুকস: ঠিক আছে। প্রসেসিং ব্যতীত চেষ্টা / চেষ্টা সবই এটাই। যদি আপনার simulateজিনিসগুলি এটি ধরে রাখতে এবং আবার চেষ্টা করতে পারে তবে এটি ভাল। তবে যদি এটি "ব্যর্থ" হয় তবে এটি আর ফিরে আসবে না None। এটি যে স্ক্রিপ্টটিকে ডেকেছে তার কেবলমাত্র ব্যতিক্রম বাড়াতে হবে। যেভাবেই হোক, হয়ে simulateগেছে। রিটার্নিং Noneযথাযথ ব্যতিক্রম বাড়াতে যেমন সহায়তা করে না - বা কোনও ব্যতিক্রমকে simulateহ্যান্ডলিংয়ের জন্য কলিং স্ক্রিপ্টের মাধ্যমে প্রচার করতে দেয় ।
এস .লট

1
@ জেমস, except Exception:পরিবর্তে ব্যবহার করুন। এটি Warningএবং সাথে "সমস্ত" আসল "ত্রুটি ধরা দেয় StopIteration। এটি অনুমতি দেয় KeyboardInterruptএবং SystemExitযদিও মাধ্যমে। আপনি যদি সত্যিই সেগুলি ধরতে চান তবে সম্ভবত অন্য কোনও, বহিরাগত চেষ্টা / বাদে বা অন্য কোনও কাঠামো ব্যবহার করা ভাল যা আপনার উদ্দেশ্যকে স্পষ্ট করে দলিল করে, কারণ সেগুলি "ত্রুটি" নয়। (তবে আমি "প্রায় কখনওই বলিনি" ... সম্ভবত আপনার ক্ষেত্রে আপনি সব কিছু দখল করতে চান এবং এমনকি সিটিআরএল-সি বা sys.exit()বেরিয়ে আসা ইত্যাদি রোধ করতে চান )
পিটার হ্যানসেন

উত্তর:


119

ব্যতিক্রম ভয় করবেন না! আপনার প্রোগ্রামটি কেবল লগইন করা এবং চালিয়ে যাওয়া ঠিক তত সহজ:

try:
    result = simulate(open("myfile"))
except SimulationException as sim_exc:
    print "error parsing stream", sim_exc
else:
    if result:
        print "result pass"
    else:
        print "result fail"

# execution continues from here, regardless of exception or not

সঠিকভাবে কী ভুল হয়েছে সে সম্পর্কে সিমুলেট পদ্ধতি থেকে এখন আপনি আরও সমৃদ্ধ ধরণের বিজ্ঞপ্তি পেতে পারেন, যদি আপনি যথেষ্ট তথ্যবহুল না হয়ে ত্রুটি / নো-ত্রুটি খুঁজে পান।


একমত। উপরের স্পষ্টত আরও জনপ্রিয় সমাধানের চেয়ে অনেক বেশি অজগর (যা সি কোডের মতো খুব বেশি গন্ধ পাচ্ছে)।
ব্র্যান্ডন

7
@ ব্র্যান্ডন একমত নয় এই কোডটি দীর্ঘতর এবং আরও খারাপ, উপরের সমাধানের তুলনায় কম পঠনযোগ্য (বা নীচের উন্নত সংস্করণ): আরও ইনডেন্টেশন, আরও আলাদা বিবৃতি - অনুমান করুন কেন পরবর্তীটি আরও জনপ্রিয়, কারণ আপনি বলছেন ... ;-) কেন চেষ্টা করা হচ্ছে 'পাইথোনিক' যদি এটি আরও বিশ্রী কোডের দিকে নিয়ে যায় ...?
রল্ফ বার্টস্ট্র

এখন "ত্রুটি পার্সিং স্ট্রিম" এর পরিবর্তে ট্রেসব্যাক মুদ্রণ করুন এবং আপনি আমার ভোট পেয়েছেন।
সিভিফ্যান

ঠিক আছে, আপনি যেভাবেই হোক আমার ভোট পেয়েছিলেন, তবে আমার অর্থ এমন কিছু মুদ্রণ করা হয়েছিল traceback.format_exc() এই এসও উত্তর দেখুন।
সিভিফ্যান

10
শিরোনাম প্রশ্নের উত্তর খুঁজতে অনেক লোক এই পৃষ্ঠায় আসবে। আমাদের বেশিরভাগের জন্য "ব্যতিক্রম ভয় করবেন না!" আমাদের পরিস্থিতির সাথে কিছু করার নেই। আমাদের কেবল সত্য, মিথ্যা এবং কোনওটির জন্য পরীক্ষা করা দরকার। যদিও আপনার প্রস্তাবিত বিকল্পটি কিছু ক্ষেত্রে বৈধ, তবে আমি মনে করি যে এটি জিজ্ঞাসা করা হয়েছিল তার উত্তরও অন্তর্ভুক্ত করা ভাল।
ਵਿਸ਼ਾਲভাবে সুপিরিয়রম্যান

161
if result is None:
    print "error parsing stream"
elif result:
    print "result pass"
else:
    print "result fail"

এটি সহজ এবং স্পষ্ট রাখুন। আপনি অবশ্যই একটি অভিধান পূর্বনির্ধারিত করতে পারেন।

messages = {None: 'error', True: 'pass', False: 'fail'}
print messages[result]

আপনি যদি simulateআরও ফিরতি কোড অন্তর্ভুক্ত করার জন্য আপনার ফাংশনটি সংশোধন করার পরিকল্পনা করেন তবে এই কোডটি বজায় রাখা কিছুটা সমস্যা হতে পারে।

simulateএছাড়াও, পার্সিং ত্রুটি উপর একটি ব্যতিক্রম বাড়াতে পারে যে ক্ষেত্রে আপনি পারেন তা এখানে ধরা হবে চাই বা এটি একটি স্তর উপরে সঞ্চারিত দিন এবং প্রিন্টিং বিট একটি এক লাইন যদি 'অন্য বিবৃতি কমে যাবে।


1
দ্বিতীয়টি সত্য বা মিথ্যা বিরুদ্ধে একটি স্পষ্ট পরীক্ষার মতো, তাই না?
পিটার আইসেন্ট্রাট

1
অবশ্যই, তবে এগুলি কেবল সম্ভাব্য ফিরতি মান হিসাবে জেনেও আমি মনে করি এটি কোনও সমস্যা নয়।
সাইলেন্টগোস্ট

এবং এটিও কিছুটা দ্রুত হবে বলে মনে হচ্ছে
সাইলেন্টগোস্ট

a = 'foo' যদি a: মুদ্রণ 'এর সত্য' a আসলে সত্য নয়, এটি ঠিক
কোনওটি

17

কখনই না, কখনও বলি না

if something == True:

কখনও। এটি পাগল, যেহেতু আপনি যদি অপ্রয়োজনীয়ভাবে পুনরায় অপ্রয়োজনীয়তার সাথে পুনরাবৃত্তি করছেন তবে যদি কোনও বিবৃতিতে অযথা শর্ত বিধি হিসাবে নির্ধারিত হয়।

সবচেয়ে খারাপ, এখনও, কখনও না, কখনও বলবেন না

if something == False:

আপনার আছে not। এটি বিনামূল্যে নির্দ্বিধায়।

অবশেষে, a == Noneকরা অদক্ষ। কি a is NoneNoneএকটি বিশেষ সিঙ্গলটন অবজেক্ট, কেবল একটিই থাকতে পারে। আপনার যদি সেই অবজেক্টটি আছে তবে তা পরীক্ষা করে দেখুন।


3
এর সাথে সাম্যের জন্য পরীক্ষা Trueনিরঙ্কুশ নয় (যদিও আমি সম্মত এটি বুদ্ধিমান নয়)। এটি কোনও __eq__বা অন্য বিশেষ পদ্ধতিতে কল করা যেতে পারে যা ব্যবহারিকভাবে কিছু করতে পারে।
স্কট গ্রিফিথস

5
@ স্কট গ্রিফিথস: ভাল কথা। এটি সত্যই এবং গভীরভাবে ভয়াবহ পরিস্থিতি। যদি আসলে এটি হয় তবে প্রোগ্রামটি আমাদের মৌলিক প্রত্যাশাগুলিকে এমনভাবে লঙ্ঘন করে যা এমন কিছু তৈরি করে যা এমন কালো যাদু ছাড়াই খালি মুছে ফেলা এবং পুনরায় লেখার প্রয়োজন।
এস .লট

78
'কখনোই না, কখনোই না, কখনোই না' ...? এমন কিছু ঘটনা রয়েছে যা এর if something == Trueচেয়ে আলাদা ফলাফল দেয় if something, যেমন নন-বুলিয়ান something2==Trueমিথ্যা ফলন করে যেখানে 2সত্যকে মূল্যায়ন করা হয়; None==Falseমিথ্যা তবে not Noneসত্য!
রল্ফ বারটস্ট্র

9
-1 এই উত্তরটি বিভ্রান্তিমূলক এবং সম্পূর্ণরূপে ভুল, যেহেতু @ রল্ফ বারস্ট্রা যা বলেছেন তা সত্য। যদিও এই ক্ষেত্রে, আপনি যা বলছেন তা প্রয়োগ করা যেতে পারে।
হ্যালো গুডবাই

3
-1। যেহেতু কোনও অ-শূন্য বা শূন্য নয় বা শূন্য নন-দৈর্ঘ্যের মানটি somethingফেরতের Trueজন্য bool(something)। সেক্ষেত্রে, আপনি যদি কেবলমাত্র চেক করতে চান যদি somethingএকটি মান আছে Trueঅর্থাত bool। তারপরে আপনার if something == Trueআইএমও করতে হবে ।
সমরথ শাহ

2

আমি যে জোর দেয় এমনকি যদি পরিস্থিতিতে যেখানে আছে মত হবে if expr :যথেষ্ট এক করতে চাইছে কারণ নিশ্চিত নয় exprহয় Trueএবং মাত্র ভিন্ন নয় 0/ None/ যাই হোক না কেন, isথেকে prefered করা হয় == একই কারণে S.Lott এড়ানো জন্য mentionned জন্য== None

এটি প্রকৃতপক্ষে কিছুটা দক্ষ এবং, কেকের উপর চেরি, আরও বেশি মানব পাঠযোগ্য।

In [1]: %timeit (1 == 1) == True
38.1 ns ± 0.116 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [2]: %timeit (1 == 1) is True
33.7 ns ± 0.141 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

1
আপনি একবারে একটি মাপদণ্ড চালাতে পারবেন না এবং বলতে পারেন যে একজন অপরটির তুলনায় আরও দক্ষ (যদিও এটি হতে পারে)। এটি কীভাবে গড় ব্যবহার করে তা দেখতে এটি বহুবার (10.000) চালান \
ব্যবহারকারী 1767754

1

আমি বিশ্বাস করি একটি ব্যতিক্রম ছোঁড়া আপনার পরিস্থিতি জন্য একটি ভাল ধারণা। একটি বিকল্প একটি টিউপল ফিরে আসার সিমুলেশন পদ্ধতি হবে। প্রথম আইটেমটি স্থিতি এবং দ্বিতীয়টি ফলাফল হবে:

result = simulate(open("myfile"))
if not result[0]:
  print "error parsing stream"
else:
  ret= result[1]

1
ফিরতি দুগল সাধারণত একটি টিপল আনপ্যাক করে ভাল হয়;)
সাইলেন্টগোস্ট

2
আপনার কোডটি অবশ্য খুব একটা বোঝায় না, যদি Falseফিরে আসে তবে তা মুদ্রণ করবে 'error parsing stream'
সাইলেন্টগোস্ট

সিমুলেট পদ্ধতিটি (মিথ্যা, "কিছুতেই আদৌ") বা (সত্য, রেট) ফিরে আসা উচিত যেখানে ret হয় মিথ্যা বা সত্য।
কেজিয়ান্নাকাকিস

2
ভাল, আপনি আপনার যুক্তি অনুসারে আউটপুট মানগুলি পুনরায় সংজ্ঞায়িত করছেন, এটি স্পষ্ট নয় w / o এর ব্যাখ্যা
সাইলেন্টগোস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.