পাইথনের কোনও ভেরিয়েবল একটি অভিধান কিনা তা আপনি কীভাবে পরীক্ষা করবেন?
এটি একটি দুর্দান্ত প্রশ্ন, তবে এটি দুর্ভাগ্যজনক যে সর্বাধিক উত্সাহিত উত্তর একটি দুর্বল সুপারিশ নিয়ে আসে type(obj) is dict,।
(মনে রাখবেন যে আপনার dictপরিবর্তনশীল নাম হিসাবেও ব্যবহার করা উচিত নয় - এটি বিল্টিন অবজেক্টের নাম))
যদি আপনি এমন কোড লিখতে থাকেন যা অন্যরা আমদানি এবং ব্যবহার করবে, তবে মনে করবেন না যে তারা ডিক্ট বিল্টিন সরাসরি ব্যবহার করবে - এই অনুমান করা আপনার কোডটিকে আরও জটিল করে তোলে এবং এই ক্ষেত্রে সহজেই লুকানো বাগগুলি তৈরি করে যা প্রোগ্রামটিকে ত্রুটিযুক্ত করবে না create ।
আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি, ভবিষ্যতের ব্যবহারকারীদের জন্য নির্ভুলতা, রক্ষণাবেক্ষণযোগ্যতা এবং নমনীয়তার লক্ষ্যে, যখন আরও নমনীয়, মূ .় অভিব্যক্তিগুলি থাকে তখন আপনার কোডে কখনও কম নমনীয়, ইউনিডিয়োম্যাটিক এক্সপ্রেশন না থাকে।
isবস্তুর পরিচয়ের জন্য পরীক্ষা । এটি উত্তরাধিকারকে সমর্থন করে না, এটি কোনও বিমূর্ততা সমর্থন করে না এবং এটি ইন্টারফেসকে সমর্থন করে না।
তাই আমি বিভিন্ন বিকল্প প্রদান করব।
সহায়ক উত্তরাধিকার:
এই প্রথম সুপারিশ আমি করতে হবে, কারণ এটা ব্যবহারকারীদের একটি অভি তাদের নিজস্ব উপশ্রেণী, অথবা সরবরাহ জন্য করতে পারবেন OrderedDict, defaultdictঅথবা Counterথেকে সংগ্রহ মডিউল:
if isinstance(any_object, dict):
তবে আরও নমনীয় বিকল্প রয়েছে।
সমর্থন বিমূর্ততা:
from collections.abc import Mapping
if isinstance(any_object, Mapping):
এটি আপনার কোডের ব্যবহারকারীর একটি বিমূর্ত ম্যাপিংয়ের নিজস্ব কাস্টম বাস্তবায়ন ব্যবহার করতে সহায়তা করে, যার কোনও সাবক্লাসও অন্তর্ভুক্ত রয়েছে dictএবং এখনও সঠিক আচরণ পেতে পারে।
ইন্টারফেস ব্যবহার করুন
আপনি সাধারণত ওওপি পরামর্শ, "ইন্টারফেস থেকে প্রোগ্রাম" শুনতে পান।
এই কৌশলটি পাইথনের পলিমারফিজম বা হাঁস-টাইপিংয়ের সুবিধা নেয়।
সুতরাং কেবলমাত্র যুক্তিসঙ্গত ফ্যালব্যাক সহ নির্দিষ্ট প্রত্যাশিত ত্রুটিগুলি ( AttributeErrorযদি নেই .itemsএবং TypeErrorক্ষেত্রে কল itemsকরা যায় না) ধরে ইন্টারফেসটি অ্যাক্সেস করার চেষ্টা করুন - এবং এখন যে ইন্টারফেসটি প্রয়োগ করে এমন কোনও শ্রেণি আপনাকে তার আইটেম দেবে (নোটটি .iteritems()পাইথনে গেছে 3):
try:
items = any_object.items()
except (AttributeError, TypeError):
non_items_behavior(any_object)
else: # no exception raised
for item in items: ...
সম্ভবত আপনি ভাবতে পারেন যে এইভাবে হাঁস-টাইপিং ব্যবহার করা অনেক বেশি মিথ্যা ধনাত্মকতার পক্ষে মঞ্জুরি দেয় এবং এই কোডটির জন্য আপনার উদ্দেশ্যগুলির উপর নির্ভর করে এটি হতে পারে।
উপসংহার
isপ্রমিত নিয়ন্ত্রণ প্রবাহের জন্য প্রকারগুলি পরীক্ষা করতে ব্যবহার করবেন না । ব্যবহার করুন isinstance, Mappingবা মত বিমূর্তি বিবেচনা করুন MutableMappingএবং সরাসরি ইন্টারফেস ব্যবহার করে টাইপ-চেকিং এড়ানো সম্পূর্ণ বিবেচনা করুন।