পাইথনে ইএএফপি নীতিটি কী?


উত্তর:


215

শব্দকোষ থেকে :

অনুমতি চেয়ে ক্ষমা চাইতে সহজ। এই সাধারণ পাইথন কোডিং শৈলীটি বৈধ কী বা বৈশিষ্ট্যগুলির অস্তিত্ব ধরে নিয়েছে এবং যদি অনুমানটি মিথ্যা প্রমাণিত হয় তবে ব্যতিক্রমগুলি ধরবে। এই পরিষ্কার এবং দ্রুত শৈলীটি অনেকের উপস্থিতি tryএবং exceptবিবৃতি দ্বারা চিহ্নিত করা হয় । কৌশলটি সি অন্যান্য হিসাবে অনেক অন্যান্য ভাষায় সাধারণ LBYL শৈলীর সাথে বিপরীতে রয়েছে ts

একটি উদাহরণ হ'ল একটি অভিধান কী অ্যাক্সেস করার চেষ্টা।

EAFP:

try:
    x = my_dict["key"]
except KeyError:
    # handle missing key

LBYL:

if "key" in my_dict:
    x = my_dict["key"]
else:
    # handle missing key

এলবিওয়াইএল সংস্করণটি অভিধানের ভিতরে কীটি দু'বার অনুসন্ধান করতে হবে এবং এটিকে কিছুটা কম পঠনযোগ্যও বলে মনে করা যেতে পারে।


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

23
পাইথন ওই উভয় এড়ানো, যদি হ্যান্ডলার শুধু একটি ডিফল্ট মান বরাদ্দ করা হয় একটি উপায় জন্য প্রদান করে xযখন চাবি অস্তিত্ব নেই: x = mydict.get('key')ফিরে আসবে Noneযদি 'key'নেই my_dict; আপনি এটি করতেও পারেন .get('key', <something>), এবং এরপরে এক্স অভিধানটি নির্দিষ্ট করা হবে যদি অভিধানে কী না থাকে। dict.setdefault()এবং collections.defaultdictঅতিরিক্ত কোড এড়ানোর জন্য দুর্দান্ত জিনিস।
জাব

1
আমি মনে করি except KeyErrorপাশাপাশি AttributeErrorসহজ কিন্তু কিছু খারাপ উদাহরণ। অনেক সময় আমি কোনও ডিবাগ করতে আটকেছিলাম কারণ except AttributeErrorভুল জায়গায় রাখা হয়েছিল, যা ভুল গুণকে ত্রুটিটিকে শৃঙ্খলে আরও গভীর করে তুলে ধরা দেয়। উন্নত উদাহরণ আমি মনে করি আছেন: try: open() ... except: IOError। বাtry: parseLine() ... except ParseError
স্কি

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

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

9

আমি এটি অন্য একটি উদাহরণ দিয়ে ব্যাখ্যা করার চেষ্টা করব।

এখানে আমরা ফাইলটি অ্যাক্সেস করার এবং কনসোলে সামগ্রীগুলি মুদ্রণের চেষ্টা করছি।

এলবিওয়াইএল - আপনি লাফানোর আগে দেখুন:

আমরা ফাইলটি অ্যাক্সেস করতে পারি কিনা তা আমরা যাচাই করতে চাই এবং যদি পারি তবে আমরা এটি খুলব এবং সামগ্রীগুলি মুদ্রণ করব। আমরা যদি ফাইলটি অ্যাক্সেস করতে না পারি তবে আমরা elseঅংশটি আঘাত করব । এটি প্রথমে একটি অ্যাক্সেস-চেক করার কারণে এটি একটি রেসের শর্ত হওয়ার কারণ। আমরা পৌঁছানোর সময় with open(my_file) as f:সম্ভবত কিছু অনুমতি সমস্যার কারণে আমরা এটিকে আর অ্যাক্সেস করতে পারি না (উদাহরণস্বরূপ অন্য প্রক্রিয়াটি একটি এক্সক্লুসিভ ফাইল লক অর্জন করে)। এই কোডটি সম্ভবত একটি ত্রুটি ফেলবে এবং আমরা সেই ত্রুটিটি ধরতে পারব না কারণ আমরা ভেবেছিলাম যে আমরা ফাইলটি অ্যাক্সেস করতে পারি।

import os

my_file = "/path/to/my/file.txt"

# Race condition
if os.access(my_file, os.R_OK):
    with open(my_file) as f:
        print(f.read())
else:
    print("File can't be accessed")

ইএএফপি - অনুমতি চেয়ে ক্ষমা চাওয়া সহজ:

এই উদাহরণে, আমরা কেবল ফাইলটি খোলার চেষ্টা করছি এবং যদি আমরা এটি খুলতে না পারি তবে এটি একটি নিক্ষেপ করবে IOError। যদি আমরা পারি তবে আমরা ফাইলটি খুলব এবং সামগ্রীগুলি মুদ্রণ করব। সুতরাং কিছু জিজ্ঞাসার পরিবর্তে আমরা এটি করার চেষ্টা করছি । যদি এটি কাজ করে, দুর্দান্ত! যদি এটি না হয় তবে আমরা ত্রুটিটি ধরা এবং এটি পরিচালনা করি।

# # No race condition
try:
    f = open(my_file)
except IOError as e:
    print("File can't be accessed")
else:
    with f:
        print(f.read())

আমি নিশ্চিত নই যে এটি বর্ণের শর্ত হিসাবে বর্ণনা করা সঠিক। হয় ফাইল অ্যাক্সেসযোগ্য না হয়।
ds4940

3
@ ds4940 ফাইলের অ্যাক্সেসযোগ্যতা যদি 6 থেকে lines লাইনের মধ্যে পরিবর্তন হয় তবে এটি ফাইলের অ্যাক্সেসযোগ্য কিনা তা খতিয়ে দেখার এবং এটি খোলার মধ্যে রয়েছে the
মার্কাস ভন ব্রোডি

@ মারকুসভনড্রোডি একমত হয়েছিলেন, রেসের শর্তে অন্য অংশগ্রহণকারীদের একটি উদাহরণ দেওয়ার জন্য উত্তরটি সম্পাদনা করেছেন।
ds4940

6

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

আমার অনুভূতিটি হ'ল কোনও ব্যবহারকারী যদি ভুল করে চলেছে তবে তাদের অবশ্যই সময় পরিণতি ভোগ করা উচিত। যে সরঞ্জামগুলি সঠিক উপায়ে ব্যবহার করে তাদের মধ্যে।

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