පයිතන් අතර 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')
අපි උප පංතියක් වන ආ ict ාවකින් සම්මත වීමට උත්සාහ කළහොත් 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))
.