হাঁসের টাইপিং সম্পর্কে :
সঠিকভাবে ব্যবহার নিশ্চিত করার জন্য ডকুমেন্টেশন, ক্লিয়ার কোড এবং পরীক্ষার উপর নির্ভর করে পদ্ধতিতে এবং ফাংশন বডিগুলিতে আর্গুমেন্টের ধরণের জন্য পরীক্ষামূলকভাবে পরীক্ষা না করে হাঁসের টাইপিং সহায়তা করে।
যুক্তি বৈধতা সম্পর্কে (ইএএফপি: অনুমতি চেয়ে ক্ষমা চাইতে আরও সহজ)। এখান থেকে গৃহীত একটি উদাহরণ :
... এটি করা বেশি পাইথোনিক হিসাবে বিবেচিত:
def my_method(self, key):
try:
value = self.a_dict[member]
except TypeError:
# do something else
এর অর্থ হ'ল আপনার কোড ব্যবহার করা অন্য যে কোনও একটি আসল অভিধান বা সাবক্লাস ব্যবহার করতে হবে না - তারা ম্যাপিং ইন্টারফেস প্রয়োগকারী কোনও বস্তু ব্যবহার করতে পারে।
দুর্ভাগ্যক্রমে অনুশীলনে এটি এত সহজ নয়। উপরের উদাহরণে সদস্য যদি একটি পূর্ণসংখ্যা হতে পারে তবে কী হবে? পূর্ণসংখ্যার পরিবর্তনযোগ্য - তাই এগুলি অভিধান কী হিসাবে ব্যবহার করা পুরোপুরি যুক্তিসঙ্গত। তবে সেগুলি সিকোয়েন্স টাইপ অবজেক্টগুলিকেও সূচী করতে ব্যবহৃত হয়। সদস্য যদি একটি পূর্ণসংখ্যা হিসাবে দেখা দেয় তবে উদাহরণ দুটি তালিকা এবং স্ট্রিং পাশাপাশি অভিধানের মাধ্যমে দিতে পারে।
জোরালো প্রোগ্রামিং সম্পর্কে :
বাগগুলি ধরার লক্ষ্য নিয়ে প্রোগ্রামারের প্রত্যাশার মতো কোনও প্রোগ্রামের অভ্যন্তরীণ অবস্থা যেমন রয়েছে তা যাচাই করার জন্য জোর দেওয়া পদ্ধতিগত উপায়। বিশেষত, কোডটি লেখার সময় করা হয়েছিল এমন মিথ্যা অনুমানগুলি ধরা বা অন্য প্রোগ্রামার দ্বারা কোনও ইন্টারফেসের অপব্যবহার করার জন্য তারা ভাল they তদতিরিক্ত, তারা প্রোগ্রামারের অনুমানগুলি সুস্পষ্ট করে কিছু পরিমাণে ইন-লাইন ডকুমেন্টেশন হিসাবে কাজ করতে পারে। ("স্পষ্ট বর্ণিত চেয়ে ভাল।")
উল্লিখিত ধারণাগুলি কখনও কখনও দ্বন্দ্বের মধ্যে থাকে, তাই আমি যখন কোনও ডেটা বৈধতা না করি, দৃ strong় বৈধতা না করি বা দৃ use়পদ ব্যবহার করি তা বেছে নেওয়ার সময় আমি নিম্নলিখিত কারণগুলির উপর নির্ভর করি:
শক্তিশালী বৈধতা। শক্তিশালী বৈধতার দ্বারা আমার অর্থ একটি কাস্টম ব্যতিক্রম উত্থাপন (
ApiError
উদাহরণস্বরূপ)। যদি আমার ফাংশন / পদ্ধতিটি সর্বজনীন এপিআইয়ের অংশ হয় তবে অপ্রত্যাশিত ধরণের সম্পর্কে ভাল ত্রুটি বার্তাটি দেখানোর পক্ষে যুক্তিটি বৈধতা দেওয়া ভাল। প্রকারটি পরীক্ষা করে আমি বোঝাতে চাইছি না কেবলisinstance
তবে ব্যবহার করা বস্তুটি প্রয়োজনীয় ইন্টারফেসটিকে সমর্থন করে (হাঁসের টাইপিং)। আমি এপিআই নথিভুক্ত করার সময় এবং প্রত্যাশিত প্রকারটি নির্দিষ্ট করে দিলে এবং ব্যবহারকারী আমার অপ্রত্যাশিত উপায়ে আমার ফাংশনটি ব্যবহার করতে চাইতে পারে, তবে অনুমানগুলি পরীক্ষা করে আমি নিরাপদ বোধ করি। আমি সাধারণত ব্যবহার করিisinstance
এবং পরে যদি আমি অন্য ধরণের বা হাঁসকে সমর্থন করতে চাই তবে আমি বৈধতা যুক্তিটি পরিবর্তন করি।জোরদার প্রোগ্রামিং। যদি আমার কোডটি নতুন হয় তবে আমি প্রচুর পরিমাণে সংস্থান ব্যবহার করি। এই সম্পর্কে আপনার পরামর্শ কি? আপনি কি পরে কোড থেকে সম্পদগুলি সরিয়ে ফেলবেন?
যদি আমার ফাংশন / পদ্ধতি কোনও এপিআইয়ের অংশ না হয় তবে এর কিছু যুক্তি অন্য কোনও কোডের মাধ্যমে দিয়ে যায় যা আমার দ্বারা লিখিত, অধ্যয়ন করা বা পরীক্ষিত হয় না, আমি তথাকথিত ইন্টারফেস অনুযায়ী প্রচুর দৃ .়তা করি। এর পেছনে আমার যুক্তি - আমার কোডে আরও ভাল ব্যর্থ, তারপরে কোথাও 10 লেভেল গভীরভাবে স্ট্যাকট্র্যাসে অজানা ত্রুটি যা আরও অনেক ডিবাগ করতে বাধ্য করে এবং পরে আমার কোডটিতে দৃsert়তা যুক্ত করে।
প্রকার / মান বৈধতা কখন ব্যবহার করবেন বা ব্যবহার করবেন না সে বিষয়ে মন্তব্য এবং পরামর্শগুলি? প্রশ্নের সেরা গঠনের জন্য না দুঃখিত।
উদাহরণস্বরূপ নিম্নলিখিত ফাংশনটি বিবেচনা করুন, যেখানে Customer
একটি এসকিউএএলএলচেমি ঘোষণামূলক মডেল রয়েছে:
def add_customer(self, customer):
"""Save new customer into the database.
@param customer: Customer instance, whose id is None
@return: merged into global session customer
"""
# no validation here at all
# let's hope SQLAlchemy session will break if `customer` is not a model instance
customer = self.session.add(customer)
self.session.commit()
return customer
সুতরাং, বৈধতা পরিচালনা করার বিভিন্ন উপায়:
def add_customer(self, customer):
# this is an API method, so let's validate the input
if not isinstance(customer, Customer):
raise ApiError('Invalid type')
if customer.id is not None:
raise ApiError('id should be None')
customer = self.session.add(customer)
self.session.commit()
return customer
অথবা
def add_customer(self, customer):
# this is an internal method, but i want to be sure
# that it's a customer model instance
assert isinstance(customer, Customer), 'Achtung!'
assert customer.id is None
customer = self.session.add(customer)
self.session.commit()
return customer
আপনি কখন এবং কেন এই প্রত্যেকটি হাঁসের টাইপিং, টাইপ চেকিং, ডেটা বৈধকরণের প্রসঙ্গে ব্যবহার করবেন?