পাইথন - বনাম বনাম যদি ফিরে আসে তবে ফিরে আসুন


12

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

এখানে আমার কোড, দুটি ভিন্ন উপায়ে একই জিনিস বাস্তবায়ন।

def modify_file(filename):
    assert os.path.isfile(filename), 'file does NOT exist.'


Traceback (most recent call last):
  File "clean_files.py", line 15, in <module>
    print(clean_file('tes3t.txt'))
  File "clean_files.py", line 8, in clean_file
    assert os.path.isfile(filename), 'file does NOT exist.'
AssertionError: file does NOT exist.

বা:

def modify_file(filename):
    if not os.path.isfile(filename):
        return 'file does NOT exist.'


file does NOT exist.

প্রথম পদ্ধতিটি এমন আউটপুট তৈরি করে যা বেশিরভাগ ক্ষেত্রে তুচ্ছ, কেবলমাত্র আমার যত্ন নেওয়া হ'ল ফাইলটির অস্তিত্ব নেই।

দ্বিতীয় পদ্ধতিটি একটি স্ট্রিং দেয়, এটি সহজ।

আমার প্রশ্নগুলি: ফাইলটি নেই বলে ব্যবহারকারীকে জানাতে কোন পদ্ধতিটি আরও ভাল? assertপদ্ধতিটি ব্যবহার করে একরকম আরও অজগর মনে হয়।

উত্তর:


33

পরিবর্তে আপনি তৃতীয় বিকল্পের সাথে যেতে চাই : ব্যবহার raiseএবং একটি নির্দিষ্ট ব্যতিক্রম। এটি অন্তর্নির্মিত ব্যতিক্রমগুলির মধ্যে একটি হতে পারে, বা আপনি কাজের জন্য একটি কাস্টম ব্যতিক্রম তৈরি করতে পারেন।

এই ক্ষেত্রে, আমি ব্যবহার করব IOError, তবে এটি একটি ValueErrorমানানসই হতে পারে:

def modify_file(filename):
    if not os.path.isfile(filename):
        raise IOError('file does NOT exist.')

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

অবশ্যই, অনেক ফাইল অপারেশন (যেমন open()) নিজেরাইOSError ইতিমধ্যে উত্থাপন করে ; ফাইল উপস্থিত থাকলে স্পষ্টতই প্রথম পরীক্ষা করা এখানে অতিরিক্ত কাজ হতে পারে।

ব্যবহার করবেন না assert; আপনি যদি -Oপতাকাটি দিয়ে অজগর চালনা করেন তবে সমস্ত দাবি কোড থেকে সরিয়ে নেওয়া হবে।


অতিরিক্ত কাজ সম্পর্কে আকর্ষণীয় বিষয়! আপনি কি এড়াতে সুপারিশ করবেন? যেমন "এটি পরে যাইহোক ব্যর্থ হবে"
সিপরিয়ান টমোইগা

1
@ সিপ্রিয়ানটোমিয়াগă: পরীক্ষায় দ্বিগুণ কেন? এর পরের লাইন যদি modify_file()হয় with open(filename) as f:, তাহলে IOErrorআরো উত্থাপিত হবে। এবং সাম্প্রতিকতম পাইথন সংস্করণগুলি IOError( FileNotFoundErrorবিশেষত মনে আসে) এর সাবক্লাসগুলিতে আরও বিশদ সরবরাহ করেছে যা এই এপিআই ব্যবহার করে কোনও বিকাশকারীকে সহায়ক হতে পারে। কোডটি যদি তার নিজস্ব চেক করে এবং উত্থাপন করে IOErrorতবে সেই সহায়ক বিশদটি নষ্ট হয়ে যাবে।
মার্টিজন পিটারস

@ মার্তিজনপিটাররা "পরীক্ষায় দ্বিগুণ কেন?" এর একটি গ্রহণযোগ্য উত্তর দেবে? যখন খোলা () ব্যর্থ হয় তখন উত্থাপিত ব্যতিক্রমের চেয়ে প্রথম চেকটি যখন দ্রুত হয়? উদাহরণস্বরূপ যখন কোনও ফাইলের অস্তিত্বের জন্য পরীক্ষা করা খোলার চেষ্টা করার চেয়ে দ্রুত হয় এবং শেষ পর্যন্ত তা করতে ব্যর্থ হয়।
মার্সেল উইলসন

1
@ মার্সেলওয়েলসন: না, কারণ আপনি কোনও পদ্ধতির বিরুদ্ধে মাইক্রো-অপ্টিমাইজ করতে চাই যা I / O করে। পাইথন শব্দার্থবিজ্ঞানে মিনিটে কোনও পরিমাণ টুইট করা আই / ও আরও দ্রুততর করে তোলে এবং কেবল পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের ক্ষতি করে। আমি আরও বলবো যে আরও প্রভাব সহ ক্ষেত্রগুলিতে মনোনিবেশ করুন।
মার্টিজন পিটারস

12

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

কোডটির মাধ্যমে আপনাকে সেই পথটি ব্যবহারের বিষয়টি নিশ্চিত করতে হওয়ায় এর মান কিছুটা সীমাবদ্ধ এবং আপনি প্রায়শই অতিরিক্তভাবে ifউত্পাদনের একটি পৃথক বিবৃতি দিয়ে সমস্যাটি পরিচালনা করতে চান । assertযেমন ব্যবহারকারীর ক্ষেত্রে সবচেয়ে উপকারী, "কোনও ব্যবহারকারী যদি এটির আঘাত করে তবে আমি এই সমস্যাটি ঘিরে সহায়কভাবে কাজ করতে চাই তবে যদি কোনও বিকাশকারী এটি হিট করে তবে আমি এটি কঠোরভাবে ক্র্যাশ করতে চাই তাই তিনি এই কোডটিকে সংশোধন করবেন যা এই ফাংশনটিকে ভুলভাবে কল করে।"

আপনার বিশেষ ক্ষেত্রে, অনুপস্থিত ফাইলটি অবশ্যই ব্যবহারকারীর ত্রুটি, এবং একটি ব্যতিক্রম উত্থাপন করে পরিচালনা করা উচিত।


5

কার্যকরভাবে ব্যবহারের ব্যবহারগুলি থেকে

আইকনস্ট্যান্স () পরীক্ষা করা অতিরিক্ত ব্যবহার করা উচিত নয়: এটি যদি হাঁসের মতো ঝাঁকুনি দেয় তবে সম্ভবত এটি সত্যই কিনা তা নিয়ে খুব গভীরভাবে অনুসন্ধান করার দরকার নেই। কখনও কখনও এটি মূল প্রোগ্রামার দ্বারা প্রত্যাশিত মানগুলি পাস করতে কার্যকর হতে পারে।

জোর দেওয়া স্থান বিবেচনা করার জায়গা:

checking parameter types, classes, or values
checking data structure invariants
checking "can't happen" situations (duplicates in a list, contradictory state variables.)
after calling a function, to make sure that its return is reasonable 

সামগ্রিক বিষয়টি হ'ল যদি কিছু ভুল হয়ে যায় তবে আমরা যত তাড়াতাড়ি সম্ভব এটি সম্পূর্ণরূপে প্রকাশ করতে চাই।

সমস্যা তৈরি হওয়ার পরে সেখানে কীভাবে এসেছিল তার চেয়ে বেশি কাজ করার চেয়ে এটি যে স্থানে যায় সেখানে ভুল ডেটা ধরা সহজ।

জোর দেওয়া ইউনিট পরীক্ষা বা সিস্টেম পরীক্ষার বিকল্প নয়, বরং পরিপূরক। যেহেতু দাবী কোনও বস্তুর বা কার্যের অভ্যন্তরীণ অবস্থা পরীক্ষা করার একটি পরিষ্কার উপায়, তারা "বিনামূল্যে জন্য" একটি ব্ল্যাক-বাক্স পরীক্ষায় একটি স্পষ্ট-বাক্স সহায়তা সরবরাহ করে যা বাহ্যিক আচরণের পরীক্ষা করে।

খারাপ ব্যবহারকারীর ইনপুট বা অপারেটিং সিস্টেম / পরিবেশের ব্যর্থতার কারণে যেমন কোনও ফাইল খুঁজে পাওয়া যায় নি তার কারণ হিসাবে ব্যর্থতার ক্ষেত্রে পরীক্ষার জন্য জোর দিয়ে ব্যবহার করা উচিত নয় । পরিবর্তে, আপনার একটি ব্যতিক্রম উত্থাপন করা উচিত, বা একটি ত্রুটি বার্তা প্রিন্ট করা উচিত বা যা উপযুক্ত। প্রোগ্রামের স্ব-পরীক্ষার জন্য কেবলমাত্র দাবিগুলি ব্যবহার করা উচিত তার একটি গুরুত্বপূর্ণ কারণ হ'ল সংকলন সময়ে দৃ time়তা অক্ষম করা যায়।

পাইথন যদি -O বিকল্প দিয়ে শুরু করা হয়, তবে জোর দিয়ে ছাঁটাই করা হবে এবং মূল্যায়ন করা হবে না। সুতরাং কোডটি যদি দৃser়ভাবে দৃ as়তার সাথে ব্যবহার করে তবে কার্য সম্পাদন-সমালোচনামূলক হয়, তবে সেগুলি রিলিজ বিল্ডগুলিতে বন্ধ করার জন্য একটি ব্যবস্থা রয়েছে। (তবে এটি প্রয়োজনীয় না হলে এটি করবেন না sci এটি বৈজ্ঞানিকভাবে প্রমাণিত হয়েছে যে কোনও গ্রাহক যখন মেশিনটি ব্যবহার করেন তখনই কিছু বাগগুলি প্রদর্শিত হয় এবং আমরা সেখানেও সাহায্যের জন্য দৃ as়তা চাই: :-))

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