পাইথন isinstance()
এবং type()
মধ্যে পার্থক্য ?
সাথে টাইপ-চেকিং
isinstance(obj, Base)
সাবক্ল্যাস এবং একাধিক সম্ভাব্য ঘাঁটির উদাহরণগুলির জন্য অনুমতি দেয়:
isinstance(obj, (Base1, Base2))
যেখানে টাইপ-চেকিং
type(obj) is Base
শুধুমাত্র রেফারেন্স করা প্রকারটি সমর্থন করে।
সাইডেনোট হিসাবে, is
সম্ভবত তুলনায় সম্ভবত আরও উপযুক্ত
type(obj) == Base
কারণ ক্লাসগুলি সিলেটলেটস।
টাইপ-চেকিং এড়ান - পলিমারফিজম (হাঁস-টাইপিং) ব্যবহার করুন
পাইথনে, সাধারণত আপনি আপনার যুক্তিগুলির জন্য যে কোনও প্রকারের অনুমতি দিতে চান, এটি প্রত্যাশিত হিসাবে বিবেচনা করুন এবং যদি বস্তুটি প্রত্যাশার সাথে আচরণ না করে তবে এটি একটি উপযুক্ত ত্রুটি উত্থাপন করবে। এটি পলিমারফিজম নামে পরিচিত, এটি হাঁস-টাইপিং নামেও পরিচিত।
def function_of_duck(duck):
duck.quack()
duck.swim()
উপরের কোডটি যদি কাজ করে তবে আমরা অনুমান করতে পারি যে আমাদের যুক্তিটি একটি হাঁস। সুতরাং আমরা অন্যান্য জিনিসগুলিতে হ'ল আসল উপ-ধরণের হাঁস:
function_of_duck(mallard)
বা সেই হাঁসের মতো কাজ:
function_of_duck(object_that_quacks_and_swims_like_a_duck)
এবং আমাদের কোড এখনও কাজ করে।
তবে এমন কিছু ঘটনা রয়েছে যেখানে স্পষ্টভাবে টাইপ-চেক করা বাঞ্ছনীয়। বিভিন্ন আপনার অবজেক্টের ধরণের সাথে সম্পর্কিত আপনার বুদ্ধিমান জিনিস থাকতে পারে। উদাহরণস্বরূপ, পান্ডাস ডেটাফ্রেম অবজেক্টটি ডিকট বা রেকর্ড থেকে তৈরি করা যেতে পারে । এই জাতীয় ক্ষেত্রে, আপনার কোডটি কী ধরণের আর্গুমেন্ট পাচ্ছে তা জানতে হবে যাতে এটি এটি সঠিকভাবে পরিচালনা করতে পারে।
সুতরাং, প্রশ্নের উত্তর দিতে:
পাইথন isinstance()
এবং type()
মধ্যে পার্থক্য ?
পার্থক্যটি প্রদর্শনের জন্য আমাকে অনুমতি দিন:
type
বলুন যে আপনার ক্রিয়াকলাপটি নির্দিষ্ট ধরণের আর্গুমেন্ট (নির্মাতাদের জন্য একটি সাধারণ ব্যবহারের ক্ষেত্রে) পেলে আপনাকে একটি নির্দিষ্ট আচরণ নিশ্চিত করতে হবে। আপনি যদি এই জাতীয় প্রকারের জন্য পরীক্ষা করেন:
def foo(data):
'''accepts a dict to construct something, string support in future'''
if type(data) is not dict:
# we're only going to test for dicts for now
raise ValueError('only dicts are supported for now')
যদি আমরা একটি ডিক যা একটি উপশ্রেণীতে পাস করার চেষ্টা করি dict
(যেমন আমাদের সক্ষম হওয়া উচিত, যদি আমরা আমাদের কোডটি লিসকভ সাবস্টিটিউশনের নীতি অনুসরণ করার প্রত্যাশা করি, তবে সেই সাব - টাইপগুলি ধরণের পরিবর্তে প্রতিস্থাপন করা যেতে পারে) আমাদের কোড ব্রেক!
from collections import OrderedDict
foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))
একটি ত্রুটি উত্থাপন!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
ValueError: argument must be a dict
isinstance
তবে আমরা যদি ব্যবহার করি তবে আমরা isinstance
লিসকভ সাবস্টিটিউশন সমর্থন করতে পারি!
def foo(a_dict):
if not isinstance(a_dict, dict):
raise ValueError('argument must be a dict')
return a_dict
foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))
আয় OrderedDict([('foo', 'bar'), ('fizz', 'buzz')])
বিমূর্ত বেস ক্লাস
আসলে, আমরা আরও ভাল করতে পারি। collections
বিমূর্ত বেস ক্লাসগুলি সরবরাহ করে যা বিভিন্ন ধরণের ন্যূনতম প্রোটোকল প্রয়োগ করে। আমাদের ক্ষেত্রে, আমরা যদি কেবল Mapping
প্রোটোকলটি আশা করি তবে আমরা নিম্নলিখিতগুলি করতে পারি এবং আমাদের কোডটি আরও নমনীয় হয়ে উঠেছে:
from collections import Mapping
def foo(a_dict):
if not isinstance(a_dict, Mapping):
raise ValueError('argument must be a dict')
return a_dict
মন্তব্য প্রতিক্রিয়া:
এটি লক্ষ করা উচিত যে প্রকারটি একাধিক ক্লাস ব্যবহার করে চেক করতে ব্যবহার করা যেতে পারে type(obj) in (A, B, C)
হ্যাঁ, আপনি ধরণের সাম্যের জন্য পরীক্ষা করতে পারেন, তবে উপরের পরিবর্তে নিয়ন্ত্রণ প্রবাহের জন্য একাধিক ঘাঁটি ব্যবহার করুন, যদি না আপনি নির্দিষ্টভাবে কেবল এই ধরণের অনুমতি দিচ্ছেন:
isinstance(obj, (A, B, C))
পার্থক্যটি আবার এটি হ'ল isinstance
উপক্লাসগুলিকে সমর্থন করে যা পিতামাতার পক্ষে অন্যথায় প্রোগ্রামটি ভাঙ্গা ছাড়াই প্রতিস্থাপিত করা যেতে পারে, এটি সম্পত্তি লিসকভের বিকল্প হিসাবে পরিচিত।
আরও ভাল, যদিও, আপনার নির্ভরতা উল্টে দিন এবং নির্দিষ্ট ধরণের জন্য মোটেও পরীক্ষা করবেন না।
উপসংহার
সুতরাং যেহেতু আমরা সাব- ক্লাসের বিকল্পগুলি সমর্থন করতে চাই, বেশিরভাগ ক্ষেত্রেই, আমরা টাইপ-চেকিং এড়াতে type
এবং এর সাথে টাইপ-চেকিং পছন্দ isinstance
করতে চাই - যদি না আপনি সত্যিই কোনও উদাহরণের সঠিক শ্রেণিটি জানতে না চান।
str
এবংunicode
(যেখানে আপনি কেবল পরীক্ষাbasestring
করতে পারেন), আপনি একাধিক ধরণের বিরুদ্ধে পরীক্ষা করার জন্য একটি টিপল ব্যবহার করতে পারেন। কিনা তা চেক করতেsomething
হয়int
বাstr
ব্যবহারisinstance(something, (int, str))
।