রিটার্ন স্টেটমেন্টগুলির সাথে অদ্ভুত চেষ্টা-বাদে অন্যথায়-শেষ আচরণ


91

এটি এমন কিছু কোড যা অদ্ভুত আচরণ করছে। এটি আমি যে আচরণটি লিখেছি তার একটি সরল সংস্করণ। এটি এখনও অদ্ভুত আচরণ প্রদর্শন করবে এবং কেন এটি হচ্ছে তা নিয়ে আমার কিছু নির্দিষ্ট প্রশ্ন ছিল।

আমি উইন্ডোজ on এ পাইথন ২.6..6 ব্যবহার করছি।

def demo1():
    try:
        raise RuntimeError,"To Force Issue"
    except:
        return 1
    else:
        return 2
    finally:
        return 3

def demo2():
    try:
        try:
            raise RuntimeError,"To Force Issue"
        except:
            return 1
        else:
            return 2
        finally:
            return 3
    except:
        print 4
    else:
        print 5
    finally:
        print 6

ফলাফল:

>>> print demo1()
3
>>> print demo2()
6
3
  • ডেমো কেন 1 এর পরিবর্তে 3 ফিরছে?
  • 6 ডাব্লু / 4 বা 5 মুদ্রণের পরিবর্তে ডেমো দুটি মুদ্রণ 6 কেন?

উত্তর:


128

কারণ finallyবিবৃতিগুলি কার্যকর করার গ্যারান্টিযুক্ত (ভাল, ধরে নেই বিদ্যুৎ বিভ্রাট বা পাইথনের নিয়ন্ত্রণের বাইরে কিছু)। এর অর্থ হল যে ফাংশনটি ফিরে আসার আগে এটি অবশ্যই অবশেষে ব্লকটি চালাবে, যা আলাদা মান দেয় returns

পাইথন ডক্স রাজ্য:

যখন কোনও রিটার্ন, বিরতি বা চালিয়ে যাওয়া বিবৃতি একটি চেষ্টা করার চেষ্টা স্যুইটে কার্যকর করা হয় ... অবশেষে বিবৃতি দেওয়া হয়, অবশেষে ধারাটিও 'বেরিয়ে যাওয়ার পথে' কার্যকর করা হয়।

কোনও ফাংশনের রিটার্ন মান নির্ধারিত শেষ রিটার্ন স্টেটমেন্ট দ্বারা নির্ধারিত হয়। যেহেতু চূড়ান্ত ধারাটি সর্বদা কার্যকর করে, শেষ অবধি কার্যকর করা একটি রিটার্ন বিবৃতি সর্বদা সর্বশেষ কার্যকর করা হবে:

এর অর্থ হ'ল আপনি যখন ফিরতে চেষ্টা করবেন তখন finallyব্লকটি ডাকা হবে, এটির চেয়ে তার মানটি ফিরে আসবে।


4
দ্বিতীয় উদাহরণে 5 টি মুদ্রণ কেন? আমি এখনও মনে করি এটি এখনও ভালভাবে ব্যাখ্যা করা হয়নি। প্রত্যাবর্তনটির একটি ভাল উত্তর দেওয়া হয়েছে তবে দ্বিতীয় উদাহরণ মুদ্রিত 5 কেন না
জোড়ান ব্যাসলি

4
ওহ, আমার মনে হয় আমি প্রারম্ভিক চেষ্টায় ফিরে আসার ফলে অবিলম্বে বাইরের দিকে ঝাঁপিয়ে পড়ে
জোড়ান ব্যাসলে

4
হুবহু, কারণ finallyব্লকগুলি সর্বদা চলমান।
গ্যারেথ লেটি

4
ডেমো টুতে, কেন এটি নেস্টেডকে শেষ পর্যন্ত কার্যকর করে, শেষ পর্যন্ত বাইরে থেকে লাথি মেরে শেষ পর্যন্ত বাইরে থেকে আর কাউকেই না ফেরার পরিবর্তে রিটার্নটি শেষ করতে শেষ দিকে ফিরে যেতে হবে?
কাইল

4
কারণ যখন returnবিবৃতিটি ডাকা হয়, পাইথন finallyযে কোনও প্রকাশ্য ধারাগুলি কার্যকর করতে হয় তা পরীক্ষা করে (উপরের উদ্ধৃতিটি দেখুন)।
গ্যারেথ লেটি

7

কার্যকর করার আদেশটি হ'ল:

  1. অবরুদ্ধ চেষ্টা করুন সমস্ত সাধারনত সম্পূর্ণ হয় -> অবশেষে ব্লক -> ফাংশন শেষ হয়
  2. ব্লক রান চেষ্টা করুন এবং ব্যতিক্রম এ -> অবশেষে ব্লক করুন -> ফাংশন শেষ হয়
  3. ব্লকটি একটি রিটার্ন মান করুন এবং কল রিটার্ন করুন -> অবশেষে ব্লক করুন -> পপআপ রিটার্ন মান -> ফাংশন শেষ

সুতরাং, অবশেষে অবরুদ্ধ ব্লকের কোনও রিটার্ন আগেই পদক্ষেপগুলি শেষ করবে end

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