ব্যতিক্রম উত্থাপন বনাম ফাংশন কোন কিছুই?


87

পাইথনের ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটিতে এর চেয়ে ভাল অনুশীলনটি কী: raiseব্যতিক্রম বা return None? উদাহরণস্বরূপ, আমার একটি ফাংশন রয়েছে যা কোনও ফোল্ডারে সর্বাধিক সাম্প্রতিক ফাইল সন্ধান করে।

def latestpdf(folder):
    # list the files and sort them
    try:
        latest = files[-1]
    except IndexError:
        # Folder is empty.
        return None  # One possibility
        raise FileNotFoundError()  # Alternative
    else:
        return somefunc(latest)  # In my case, somefunc parses the filename

আর একটি বিকল্প ব্যতিক্রম ছেড়ে কলার কোডে এটি হ্যান্ডেল করা, তবে আমি অনুমান করি যে এটি কোনওটির FileNotFoundErrorচেয়ে বেশি মোকাবেলা করা আরও স্পষ্ট IndexError। বা কোনও আলাদা নাম দিয়ে কোনও ব্যতিক্রম পুনরায় উত্থাপন করা কি খারাপ ফর্ম?



4
আমি একটি ব্যতিক্রম উত্থাপন দিকে ঝুঁকে তাই কলিং ফাংশনটিতে আমি ব্যতিক্রমটি পরিচালনা করতে বাধ্য হই। কলিং ফাংশনে আউটপুট কোনওটি নয় কিনা তা যদি আমি ভুলে যাই তবে আমার একটি সুপ্ত বাগ থাকতে পারে। আপনি যদি কোনওটিই ফেরত পান না, আশা করি কলিং ফাংশনের পরবর্তী লাইনটি একটি অ্যাট্রিবিউটআরারের উত্থাপন করবে। তবে যদি প্রত্যাশিত মানটি অভিধানে যুক্ত করা হয় এবং তারপরে 100 টি ফাংশন কলগুলি একটি আলাদা উত্স ফাইলে একটি অ্যাট্রিবিউটআরার উত্থাপিত হয়, তবে সেই মানটি কেন নয় তা খুঁজে পাওয়ার জন্য আপনি মজা পাবেন।
আইসআর্ডার

সাধারণভাবে, আমি সেই মানগুলিও এড়িয়ে চলি যার একটি বিশেষ অর্থ থাকে বা একটি ফাংশনের জন্য একাধিক স্বাক্ষর রয়েছে (এটি কোনও স্ট্রিং বা কোনও কিছুই প্রত্যাবর্তন করতে পারে)।
আইসআর্ডার

উত্তর:


92

এটি সত্যিই শব্দার্থবিজ্ঞানের বিষয়। কী foo = latestpdf(d) মানে ?

কোনও সর্বশেষ ফাইল নেই তা কি পুরোপুরি যুক্তিসঙ্গত? তারপরে নিশ্চিত, শুধু কিছুই ফেরান না

আপনি কি সর্বদা একটি সর্বশেষ ফাইল খুঁজে পেতে আশা করছেন? একটি ব্যতিক্রম উত্থাপন। এবং হ্যাঁ, আরও উপযুক্ত ব্যতিক্রম পুনরায় উত্থাপন করা ভাল।

যদি এটি কেবলমাত্র কোনও সাধারণ ক্রিয়াকলাপ যা কোনও ডিরেক্টরিতে প্রযোজ্য বলে মনে হয় তবে আমি পূর্বটি করতাম এবং কোনওটিই ফেরত দেব না। ডিরেক্টরিটি যদি উদাহরণস্বরূপ কোনও নির্দিষ্ট ডেটা ডিরেক্টরি হিসাবে বোঝায় যা কোনও অ্যাপ্লিকেশনটির ফাইলগুলির সেট রয়েছে I'd তবে আমি একটি ব্যতিক্রম বাড়াতে চাই।


4
আরেকটি বিষয় বিবেচনা করুন: যদি কোনও ব্যতিক্রম উত্থাপন করা হয় তবে একটি বার্তা সংযুক্ত করা যেতে পারে, কিন্তু ফিরে আসার সময় আমরা এটি করতে পারি না None
কাওয়িং-চিউ

10

আপনার প্রশ্নের উত্তর দেওয়ার আগে আমি কয়েকটি পরামর্শ দেব কারণ এটি আপনার পক্ষে প্রশ্নের উত্তর দিতে পারে।

  • সর্বদা আপনার ফাংশন বর্ণনামূলক নাম। latestpdfএর অর্থ কারও কাছে খুব সামান্য তবে আপনার ফাংশনটি সন্ধান করা latestpdf()সর্বশেষতম পিডিএফ পায়। আমি আপনাকে এটির নাম দেওয়ার পরামর্শ দিচ্ছি getLatestPdfFromFolder(folder)

যত তাড়াতাড়ি আমি এটি করেছি তা স্পষ্ট হয়ে গেল এটি কী ফিরে আসবে .. যদি পিডিএফ না থাকে তবে একটি ব্যতিক্রম বাড়ান। তবে আরও অপেক্ষা করুন ..

  • ফাংশনগুলি পরিষ্কারভাবে সংজ্ঞায়িত রাখুন। যেহেতু সামফুকের কী করা উচিত তা স্পষ্ট নয় এবং এটি সর্বশেষ পিডিএফ পাওয়ার সাথে কীভাবে সম্পর্কিত তা স্পষ্ট নয় (আমি স্পষ্টতই) স্পষ্টভাবে জানিনা যে আমি আপনাকে এটি সরিয়ে নেওয়ার পরামর্শ দিই। এটি কোডটিকে অনেক বেশি পঠনযোগ্য করে তোলে।

for folder in folders:
   try:
       latest = getLatestPdfFromFolder(folder)
       results = somefuc(latest)
   except IOError: pass

আশাকরি এটা সাহায্য করবে!


4
বা get_latest_pdf_from_folder। প্রকৃতপক্ষে, পেপ 8: "ফাংশনের নামগুলি ছোট হাতের অক্ষরযুক্ত হওয়া উচিত, পাঠযোগ্যতার উন্নতি করতে প্রয়োজনীয় শব্দগুলি আন্ডারস্কোর দ্বারা পৃথক করা উচিত।"
প্যাট্রিকটি

7

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

  1. আপনার ফাংশনটিতে যে কেউ ফোন করছেন তাকে ফেলে দেওয়া ব্যতিক্রমগুলি সম্পর্কে অবহিত নয়। আপনি কী ধরনের ব্যতিক্রমের শিকার হচ্ছেন তা জানার জন্য এটি কিছুটা শিল্পের আকারে পরিণত হয় (এবং ব্লকগুলি ব্যতীত জেনেরিকগুলি এড়ানো উচিত)।
  2. if val is Noneচেয়ে একটু সহজ except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace। সিরিয়াসলি, আমি from django.core.exceptions import ObjectDoesNotExistসত্যিই সাধারণ ব্যবহারের কেসটি হ্যান্ডেল করার জন্য আমার সমস্ত জাঙ্গো ফাইলের শীর্ষে টাইপ করা মনে রাখতে পছন্দ করি না। স্ট্যাটিক্যালি টাইপ করা বিশ্বে, সম্পাদকটি এটি আপনার জন্য করুন।

সত্যিই, যদিও এটি সর্বদা একটি রায় আহ্বান, এবং আপনি যে পরিস্থিতিটি বর্ণনা করছেন, যেখানে ডাকা ফাংশনটি কোনও ত্রুটি পায় যা এটি সহায়তা করতে পারে না, এটি একটি ব্যতিক্রমকে পুনর্বার উত্সাহ দেওয়ার এক দুর্দান্ত কারণ, যা অর্থবহ। আপনার সঠিক সঠিক ধারণা আছে, তবে আপনি ব্যতিক্রম না হলে স্ট্যাক ট্রেসের চেয়ে আরও অর্থবহ তথ্য সরবরাহ করতে চলেছেন

AttributeError: 'NoneType' object has no attribute 'foo'

যা দশজনের মধ্যে নয় বার, আপনি যদি একটি অপরিবর্তিত কাউকে না ফেরান তবে কলকারী যা দেখবে তা বিরক্ত করবেন না।

(এই ধরণের সমস্ত প্রকারের ফলেই আমি আশা করি যে অজগর ব্যতিক্রমগুলি causeডিফল্টরূপে জাভা হিসাবে বৈশিষ্ট্যগুলি ধারণ করে, যা আপনাকে নতুন ব্যতিক্রমগুলিতে ব্যতিক্রমগুলি পাস করতে দেয় যাতে আপনি যা চান তা পুনর্বিবেচনা করতে পারেন এবং সমস্যার মূল উত্সটি কখনই হারাতে পারবেন না))


যে যুক্তিটি সম্ভাব্য ব্যতিক্রমগুলি সংজ্ঞায়িত করা হয়নি এবং তাই এটি ধরা শক্ত তা পাইথনের পক্ষে খুব কার্যকর যুক্তি।
snorberhuis

4

অজগর 3.5 এর টাইপ সহ :

প্রত্যাবর্তনের সময় উদাহরণ ফাংশন কোনওটিই হবেনা:

def latestpdf(folder: str) -> Union[str, None]

এবং যখন ব্যতিক্রম উত্থাপন করা হবে:

def latestpdf(folder: str) -> str 

বিকল্প 2 আরও পাঠযোগ্য এবং পাইথোনিক বলে মনে হচ্ছে

(+ আগের মতামত ব্যতীত মন্তব্য যোগ করার বিকল্প।)


4
Union[str, None]হওয়া উচিতOptional[str]
জর্জি

4
একটি শর্টহ্যান্ড, তবে আপনি ঠিক বলেছেন, এটি আরও পাঠযোগ্য। উভয় বিকল্প এখানে তাই সম্পাদনা করছি না।
আসফ

4
2 সম্ভাব্যভাবে বেশি পঠনযোগ্য তবে (দুর্ভাগ্যক্রমে?) প্রকারের ইঙ্গিতগুলি কোনও ব্যতিক্রম নিক্ষেপ হতে পারে তা নির্দেশ করে না। আমি ইদানীং খুঁজে পেয়েছি যে 1 টি ত্রুটিগুলি ধরতে সহায়তা করবে কারণ আপনি কোনও নন রিটার্ন পরিচালনা করতে বাধ্য হচ্ছেন।
জোনস.এম

2

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

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