প্রদত্ত বস্তু প্রদত্ত ধরণের কিনা তা যাচাই করার সর্বোত্তম উপায় কী? কোনও নির্দিষ্ট ধরণের থেকে অবজেক্টটি উত্তরাধিকারসূত্রে রয়েছে কিনা তা যাচাই করার বিষয়ে কীভাবে?
ধরা যাক আমার একটি বিষয় আছে o
। আমি এটি কীভাবে পরীক্ষা করব str
?
প্রদত্ত বস্তু প্রদত্ত ধরণের কিনা তা যাচাই করার সর্বোত্তম উপায় কী? কোনও নির্দিষ্ট ধরণের থেকে অবজেক্টটি উত্তরাধিকারসূত্রে রয়েছে কিনা তা যাচাই করার বিষয়ে কীভাবে?
ধরা যাক আমার একটি বিষয় আছে o
। আমি এটি কীভাবে পরীক্ষা করব str
?
উত্তর:
এর o
কোনও উদাহরণ str
বা কোনও সাবক্লাস কিনা তা যাচাই করতে str
, আইসিনস্ট্যান্সটি ব্যবহার করুন (এটি "ক্যানোনিকাল" উপায় হবে):
if isinstance(o, str):
প্রকারটি o
হুবহু ঠিক আছে কিনা তা পরীক্ষা করতে str
(সাবক্লাসগুলি বাদ দিন):
if type(o) is str:
নিম্নলিখিতগুলিও কাজ করে এবং কিছু ক্ষেত্রে কার্যকর হতে পারে:
if issubclass(type(o), str):
প্রাসঙ্গিক তথ্যের জন্য পাইথন গ্রন্থাগার রেফারেন্সে অন্তর্নির্মিত ফাংশনগুলি দেখুন ।
আরও একটি নোট: এই ক্ষেত্রে, আপনি যদি পাইথন 2 ব্যবহার করেন তবে আপনি আসলে ব্যবহার করতে চাইতে পারেন:
if isinstance(o, basestring):
কারণ এই ইউনিকোড স্ট্রিং ফেলবো ( unicode
একটি উপশ্রেণী নয় str
; উভয় str
এবং unicode
এর উপশ্রেণী হয় basestring
)। দ্রষ্টব্য যে basestring
পাইথন 3 এ আর বিদ্যমান নেই, যেখানে স্ট্রিংগুলি ( ) এবং বাইনারি ডেটা ( ) এর কঠোর বিভাজন রয়েছে ।str
bytes
বিকল্পভাবে, isinstance
ক্লাসের একটি tuple গ্রহণ করে। এটি কোনওটির কোনও উপক্লাসের উদাহরণ True
হলে o
এটি ফিরে আসবে (str, unicode)
:
if isinstance(o, (str, unicode)):
type(a) is Object
তা হয় তবে এটিও সত্য নয় isinstance(a, Object)
। তবে, type(a) is SubClassOfObject
তবে type(a) is Object == False
, তবে isinstance(a, Object) == True
। রাইট?
a is b
অর্থ a এবং b হ'ল একই জিনিস, অর্থাত স্মৃতিতে একই সত্তার উল্লেখ। সুতরাং a
এবং b
ঠিক একই শ্রেণি হতে হবে, সাবক্লাস হিসাবে নয় isinstance()
। উদাহরণস্বরূপ দেখুন স্ট্যাকওভারফ্লো.com
সবচেয়ে একটি বস্তুর টাইপ চেক করতে Pythonic উপায় এটা চেক করতে নয় ...।
পাইথন যেহেতু হাঁসের টাইপিংকে উত্সাহ দেয় , তাই আপনি try...except
যেভাবে অবজেক্টের পদ্ধতিগুলি ব্যবহার করতে চান তা ব্যবহার করা উচিত। সুতরাং যদি আপনার ফাংশন কোনও লিখনযোগ্য ফাইল অবজেক্টের সন্ধান করে, এটি একটি সাবক্লাস যাচাই করবেন নাfile
, কেবল তার .write()
পদ্ধতিটি ব্যবহার করার চেষ্টা করুন !
অবশ্যই, কখনও কখনও এই দুর্দান্ত বিমূর্ততাগুলি ভেঙে যায় এবং isinstance(obj, cls)
এটি আপনার প্রয়োজন। তবে অল্প পরিমাণে ব্যবহার করুন।
if hasattr(ob, "write") and callable(ob.write):
বা কিছু ডিক অ্যাক্সেস সংরক্ষণ করুন ...func = getattr(ob, "write", None)
if callable(func): ...
hasattr
কেবল একটি অ্যাট্রিবিউটআরারকেই সুপারপ্রেস করেছেন
isinstance(o, str)
ফিরে আসবে True
যদি o
একটি হয় str
বা একটি টাইপ যে থেকে উত্তরাধিকারী হয় str
।
type(o) is str
True
কেবলমাত্র যদি o
স্ট্র থাকে তবে ফিরে আসবে । এটি False
যদি o
এমন কোনও ধরণের হয়ে থাকে যা থেকে উত্তরাধিকার সূত্রে আসে str
।
isinstance
এবং type(var) == type('')
স্পষ্ট নয়।
প্রশ্ন জিজ্ঞাসা ও উত্তর দেওয়ার পরে পাইথনে টাইপ ইঙ্গিত যুক্ত করা হয়েছিল । পাইথনে টাইপ ইঙ্গিতগুলি প্রকারগুলি পরীক্ষা করার অনুমতি দেয় কিন্তু স্ট্যাটিকালি টাইপ করা ভাষা থেকে একেবারেই আলাদা different পাইথনে টাইপ ইঙ্গিতগুলি ফাংশনগুলির সাথে প্রত্যাশিত ধরণের যুক্তিগুলি ফাংশনগুলির সাথে সম্পর্কিত রানটাইম অ্যাক্সেসযোগ্য ডেটা হিসাবে যুক্ত করে এবং এটি প্রকারগুলি পরীক্ষা করার অনুমতি দেয় । টাইপ ইঙ্গিত সিনট্যাক্স উদাহরণ:
def foo(i: int):
return i
foo(5)
foo('oops')
foo('oops')
এক্ষেত্রে আর্নোটের টীকাযুক্ত ধরণের হওয়ায় আমরা একটি ত্রুটি ট্রিগার করতে চাই int
। স্ক্রিপ্টটি স্বাভাবিকভাবে চালিত হওয়ার সাথে যুক্ত প্রকারের ইঙ্গিতটি ত্রুটির সৃষ্টি করে না । যাইহোক, এটি অন্যান্য প্রোগ্রামগুলি জিজ্ঞাসা করতে পারে এবং প্রকারের ত্রুটিগুলি যাচাই করতে ব্যবহার করতে পারে এমন প্রত্যাশিত ধরণের বর্ণনা করে ফাংশনে বৈশিষ্ট্য যুক্ত করে।
এই ধরণের ত্রুটিটি খুঁজে পেতে এই অন্যান্য প্রোগ্রামগুলির মধ্যে একটি হ'ল mypy
:
mypy script.py
script.py:12: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
( mypy
আপনার প্যাকেজ ম্যানেজার থেকে আপনার ইনস্টল করার দরকার হতে পারে I আমি মনে করি না এটি সিপিথনের সাথে আসে তবে মনে হয় এটি কিছুটা "অফিসিয়ালিটি" রয়েছে))
স্ট্যাটিকালি টাইপ করা সংকলিত ভাষায় টাইপ চেকিং টাইপ চেকিং থেকে আলাদা। পাইথনগুলিতে প্রকারগুলি গতিশীল হওয়ার কারণে, রানটাইমের সময় প্রকারের চেকিং অবশ্যই করা উচিত, যা একটি প্রযোজ্য - এমনকি সঠিক প্রোগ্রামেও - যদি আমরা জোর দিয়ে বলি যে এটি প্রতিটি সুযোগেই ঘটে। সুস্পষ্ট প্রকারের চেকগুলি প্রয়োজনের তুলনায় আরও নিয়ন্ত্রিত হতে পারে এবং অপ্রয়োজনীয় ত্রুটিগুলির কারণ হতে পারে (উদাহরণস্বরূপ, যুক্তিটি কি আসলেই সঠিকভাবে হওয়া দরকার list
বা পুনরাবৃত্ত পর্যায়ে কিছু আছে?)
সুস্পষ্ট প্রকারের চেকিংয়ের উল্টো দিকটি এটি এর আগে ত্রুটিগুলি ধরতে পারে এবং হাঁসের টাইপের চেয়ে পরিষ্কার ত্রুটি বার্তা দিতে পারে। হাঁসের ধরণের সঠিক প্রয়োজনীয়তা কেবলমাত্র বাহ্যিক ডকুমেন্টেশনের মাধ্যমে প্রকাশ করা যায় (আশা করি এটি সম্পূর্ণ এবং নির্ভুল) এবং বেমানান প্রকারের ত্রুটিগুলি যেখানে সেখান থেকে উত্পন্ন হতে পারে far
পাইথনের ধরণের ইঙ্গিত বোঝার জন্য বোঝাপড়া দেওয়া হয় যেখানে প্রকারগুলি নির্দিষ্ট করে নির্দিষ্ট করা যায় এবং পরীক্ষা করা যায় তবে স্বাভাবিক কোড কার্যকর করার সময় কোনও অতিরিক্ত ব্যয় হয় না।
typing
প্যাকেজ অফার টাইপ ভেরিয়েবল যে টাইপ নির্দেশ ব্যবহার করা যেতে পারে বিশেষ ধরনের প্রয়োজন ছাড়া প্রয়োজনীয় আচরণে প্রকাশ করার। উদাহরণস্বরূপ, এর মধ্যে চলকগুলি অন্তর্ভুক্ত রয়েছে Iterable
এবং যেমন Callable
আচরণগুলির সাথে কোনও ধরণের প্রয়োজনীয়তা নির্দিষ্ট করতে ইঙ্গিতগুলির জন্য।
টাইপ ইঙ্গিতগুলি টাইপগুলি চেক করার সর্বাধিক পাইথোনিক উপায়, তবে প্রকারটি পরীক্ষা না করা এবং হাঁসের টাইপিংয়ের উপর নির্ভর করা প্রায়শই বেশি বেশি পাইথোনিক। প্রকারের ইঙ্গিতগুলি তুলনামূলকভাবে নতুন এবং যখন জুরিটি সর্বাধিক পাইথোনিক সমাধান হয় তখনও জুরিটি বাইরে থাকে। একটি তুলনামূলকভাবে বিতর্কিত তবে খুব সাধারণ তুলনা: প্রকারের ইঙ্গিতগুলি ডকুমেন্টেশনের এমন একটি ফর্ম সরবরাহ করে যা প্রয়োগ করা যেতে পারে, কোডটি পূর্বে তৈরি করতে এবং ত্রুটিগুলি বোঝার জন্য সহজতর অনুমতি দেয়, হাঁসের টাইপিং করতে পারে না এমন ত্রুটিগুলি ধরতে পারে এবং স্ট্যাটিকভাবে পরীক্ষা করা যায় (একটি অস্বাভাবিক ক্ষেত্রে) জ্ঞান কিন্তু এটি এখনও রানটাইমের বাইরে)। অন্যদিকে, হাঁসের টাইপিং দীর্ঘকাল ধরে পাইথোনিক উপায় হয়ে দাঁড়িয়েছে, স্থির টাইপিংয়ের জ্ঞানীয় ওভারহেড চাপিয়ে দেয় না, কম ভার্জোজ, এবং সমস্ত ব্যবহার্য প্রকারভেদ গ্রহণ করবে এবং তারপরে কিছু।
mypy
এটি একটি পাইথন মডিউল যা importlib
সেই ডেটা অ্যাক্সেস করতে ব্যবহার করে। এটি "স্ট্যাটিক টাইপ চেকিং" কিনা তা দার্শনিক প্রশ্ন তবে সাধারণ ভাষার দোভাষী এবং আমদানি যন্ত্রপাতি জড়িত থাকার কারণে এটি সবচেয়ে বেশি প্রত্যাশার চেয়ে আলাদা।
এখানে একটি উদাহরণ যেখানে হাঁসের টাইপিং কেন বিপজ্জনক তা না জেনেই কেন টাইপিং দুষ্ট। উদাহরণস্বরূপ: পাইথন কোডটি এখানে (সম্ভবত যথাযথ ইনডেন্টিং বাদ দিচ্ছে), নোট করুন যে আপনার যখন সত্যিই একটি হাঁসের প্রয়োজন হবে তখন আপনি বোমা পাবেন না তা নিশ্চিত করার জন্য আইসনস্ট্যান্স এবং ইস্যুব্ল্যাকসোফ ফাংশনগুলির যত্ন নিয়ে এই পরিস্থিতি এড়ানো যায় is
class Bomb:
def __init__(self):
""
def talk(self):
self.explode()
def explode(self):
print "BOOM!, The bomb explodes."
class Duck:
def __init__(self):
""
def talk(self):
print "I am a duck, I will not blow up if you ask me to talk."
class Kid:
kids_duck = None
def __init__(self):
print "Kid comes around a corner and asks you for money so he could buy a duck."
def takeDuck(self, duck):
self.kids_duck = duck
print "The kid accepts the duck, and happily skips along"
def doYourThing(self):
print "The kid tries to get the duck to talk"
self.kids_duck.talk()
myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()
class EvilDuck(Duck)
ওভাররাইড টক () তৈরি করতে পারেন । বা আরও সম্ভবত, class ChineseCancerDuck(Duck)
একটি বাজে পার্শ্ব প্রতিক্রিয়া সহ যা বছর পরে দেখা যায় না। আপনি কেবল আপনার বাচ্চাটির তদারকি করা থেকে ভাল হবেন (এবং তার খেলনাগুলির পুরোপুরি পরীক্ষা করা :)
__file__
অন্য কিছু বোঝার জন্য অ্যাট্রিবিউটটি (সাধারণত ফাইল-জাতীয় বস্তু সনাক্তকরণে ব্যবহৃত) ওভাররাইড করে পাইথন কোডটি প্রচুর পরিমাণে বর্জন করতে পারেন ।
isinstance(o, str)
আমি মনে করি পাইথনের মতো গতিময় ভাষা ব্যবহারের দুর্দান্ত জিনিসটি হ'ল আপনার সত্যিই এর মতো কিছু পরীক্ষা করা উচিত নয়।
আমি কেবল আপনার অবজেক্টে প্রয়োজনীয় পদ্ধতিগুলি কল করব এবং এটি ধরব AttributeError
। পরবর্তীতে এর পরে আপনাকে পরীক্ষাগুলি করার জন্য কোনও বস্তুর উপহাস করার মতো বিভিন্ন কাজ সম্পাদন করতে অন্যান্য (আপাতদৃষ্টিতে সম্পর্কিত নয়) বস্তুর সাথে আপনার পদ্ধতিগুলি কল করার অনুমতি দেবে।
ওয়েব থেকে ডেটা নেওয়ার সময় আমি এটি প্রচুর ব্যবহার করেছি urllib2.urlopen()
যার সাহায্যে কোনও ফাইলের মতো বস্তু ফিরে আসে । এটি কোনও ফাইল থেকে পড়া প্রায় কোনও পদ্ধতিতে পরিবর্তিত হতে পারে, কারণ এটি একই read()
ফাইলটিকে আসল ফাইল হিসাবে প্রয়োগ করে ।
তবে আমি নিশ্চিত যে ব্যবহারের জন্য একটি সময় এবং জায়গা রয়েছে isinstance()
, অন্যথায় সম্ভবত এটি সেখানে না থাকত :)
আরও জটিল ধরণের বৈধতার জন্য আমি পাইথন টাইপ ইঙ্গিত টীকাগুলির উপর ভিত্তি করে টাইপগার্ডের যাচাইকরণের পদ্ধতি পছন্দ করি :
from typeguard import check_type
from typing import List
try:
check_type('mylist', [1, 2], List[int])
except TypeError as e:
print(e)
আপনি খুব পরিষ্কার এবং পাঠযোগ্য ফ্যাশনে খুব জটিল বৈধতা সম্পাদন করতে পারেন।
check_type('foo', [1, 3.14], List[Union[int, float]])
# vs
isinstance(foo, list) and all(isinstance(a, (int, float)) for a in foo)
আপনি একটি প্রকারের_____ ব্যবহার করে একটি পরিবর্তনশীল প্রকারের জন্য পরীক্ষা করতে পারেন।
উদা:
>>> a = [1,2,3,4]
>>> b = 1
>>> type(a).__name__
'list'
>>> type(a).__name__ == 'list'
True
>>> type(b).__name__ == 'list'
False
>>> type(b).__name__
'int'
হুগোর কাছে:
আপনি সম্ভবত list
এটির চেয়ে বরং এটি বোঝাতে চেয়েছেন array
তবে এটি টাইপ চেকিংয়ের সাথে পুরো সমস্যার দিকে ইঙ্গিত করে - আপনি জানতে চাইবেন না যে প্রশ্নে থাকা বস্তুটি একটি তালিকা, আপনি জানতে চান এটি কোনও ধরণের ক্রম বা এটি কোনও একক বস্তু কিনা। সুতরাং এটি সিক্যুয়েন্সের মতো ব্যবহার করার চেষ্টা করুন।
বলুন আপনি কোনও বিদ্যমান ক্রমিকায় অবজেক্টটি যুক্ত করতে চান, বা এটি যদি কোনও বস্তুর ক্রম হয় তবে সেগুলি সমস্ত যুক্ত করুন
try:
my_sequence.extend(o)
except TypeError:
my_sequence.append(o)
এর সাথে একটি কৌশলটি যদি আপনি স্ট্রিং এবং / অথবা স্ট্রিংয়ের ক্রমগুলি নিয়ে কাজ করছেন - তবে এটি মুশকিল, কারণ একটি স্ট্রিংটি প্রায়শই একটি একক বস্তু হিসাবে বিবেচিত হয়, তবে এটি অক্ষরেরও একটি ক্রম। এর চেয়েও খারাপ, এটি সত্যই একক দৈর্ঘ্যের স্ট্রিংগুলির ক্রম।
আমি সাধারণত আমার এপিআই ডিজাইন করতে পছন্দ করি যাতে এটি কেবলমাত্র একক মান বা সিকোয়েন্স গ্রহণ করে - এটি জিনিসগুলিকে সহজ করে তোলে। [ ]
আপনার একক মানটি যখন প্রয়োজন হয় তখন এটি পাস করার পরেও এটি কঠিন নয় ।
(যদিও এটি স্ট্রিংগুলির সাথে ত্রুটি সৃষ্টি করতে পারে, যেমনটি তারা (সিকোয়েন্সগুলি) মতো দেখাচ্ছে))
প্রকারটি যাচাই করার একটি সহজ উপায় হ'ল এটির সাথে তুলনা করা যার প্রকার আপনি জানেন।
>>> a = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True
আমি মনে করি সর্বোত্তম উপায় হ'ল আপনার ভেরিয়েবলগুলি ভাল টাইপ করা। আপনি "টাইপিং" লাইব্রেরি ব্যবহার করে এটি করতে পারেন।
উদাহরণ:
from typing import NewType
UserId = NewType ('UserId', int)
some_id = UserId (524313
) `
প্রদত্ত মানটি কোন বর্ণচিহ্নের টাইপ তা পরীক্ষা করতে নীচের লাইনের সাহায্যে পরীক্ষা করতে পারেন:
def chr_type(chrx):
if chrx.isalpha()==True:
return 'alpha'
elif chrx.isdigit()==True:
return 'numeric'
else:
return 'nothing'
chr_type("12)