পাইথন টাইপের জন্য যা যা আছে তা যাচাই করার সাধারণ উপায় কী?


1275

প্রদত্ত বস্তু প্রদত্ত ধরণের কিনা তা যাচাই করার সর্বোত্তম উপায় কী? কোনও নির্দিষ্ট ধরণের থেকে অবজেক্টটি উত্তরাধিকারসূত্রে রয়েছে কিনা তা যাচাই করার বিষয়ে কীভাবে?

ধরা যাক আমার একটি বিষয় আছে o। আমি এটি কীভাবে পরীক্ষা করব str?


7
ঠিক আছে, পাইথনের ক্যানোনিকাল পদ্ধতির হ'ল ধরণটি একেবারে না পরীক্ষা করা (যদি না আপনি ডিবাগ করছেন)। সাধারণত আপনি এটি একটি স্ট্রিং হিসাবে ব্যবহার করার চেষ্টা করেন (উদাহরণস্বরূপ অন্যান্য স্ট্রিং সহ কনসেটেট, কনসোল প্রিন্ট করুন ইত্যাদি); যদি আপনি মনে করেন এটি ব্যর্থ হতে পারে তবে চেষ্টা করুন / বাদে বা হ্যাশট্র ব্যবহার করুন। এটি বলেছিল, গৃহীত উত্তর হ'ল পাইথন বিশ্বে আপনি সাধারণত "করণীয়" না করার করণীয় উপায়। : আরও তথ্যের জন্য, Google "পাইথন হাঁস টাইপিং" বা এই পড়া voidspace.org.uk/python/articles/duck_typing.shtml stackoverflow.com/questions/610883/...
জন Coombs

9
আমি মনে করি মিঃ কমবস নন-জেএসওএন সিরিয়ালাইজযোগ্য ক্লাসগুলির মতো নজরে আসছেন। যদি কোনও ফাংশনের মাধ্যমে ডেটাগুলির একটি বিশাল অংশ স্থাপন করা হয় (যার কোডটি কোনও প্রভাব ফেলতে পারে না) উদাহরণস্বরূপ, কোনও ডেটা নির্দিষ্ট কিছু টুকরোতে রূপান্তর করতে পারে, উদাহরণস্বরূপ, কোনও পাসওয়ার আগে <<> কমপক্ষে আমি এই পৃষ্ঠায় এভাবেই শেষ হয়েছি ...
জন ক্যারেল

2
এটির জন্য জিজ্ঞাসা করার সর্বাধিক সাধারণ কারণটি হল যে কেউ স্ট্রিং এবং পুনরাবৃত্ত স্ট্রিংগুলির মধ্যে পার্থক্য করতে চায়। এটি একটি কূট প্রশ্ন কারণ স্ট্রিং হয় স্ট্রিং iterables - একটি একক অক্ষর স্ট্রিং এমনকি নিজেই একটা ক্রম (- এক সম্ভবত এটি উপর নির্ভর করা উচিত নয় শেষবার আমি চেক) হয়। কিন্তু কেউ কি কখনও স্ট্রিং-জাতীয় কিছু ব্যবহার করতে পারে? হ্যাঁ । সুতরাং উত্তরটি "স্ট্রিং এবং অন্যান্য পুনরাবৃত্ত স্ট্রিংগুলির মধ্যে পার্থক্য করার জন্য আমার কী করা উচিত?" সঠিকভাবে: "এটি আপনি কী করতে চেষ্টা করছেন তার উপর নির্ভর করে"। :-D
ক্ল্যাক

2
পাইথন ধরণের টীকাগুলি এখন একটি জিনিস। মাইপি
শীনা

উত্তর:


1521

এর 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 এ আর বিদ্যমান নেই, যেখানে স্ট্রিংগুলি ( ) এবং বাইনারি ডেটা ( ) এর কঠোর বিভাজন রয়েছে ।strbytes

বিকল্পভাবে, isinstanceক্লাসের একটি tuple গ্রহণ করে। এটি কোনওটির কোনও উপক্লাসের উদাহরণ Trueহলে oএটি ফিরে আসবে (str, unicode):

if isinstance(o, (str, unicode)):

31
স্ট। (যে কাজের জন্য, আপনি recursively কল .__ উপশ্রেণী করতে হবে __ ()।
টমাস Wouters

15
এটি একটি ভাল উত্তর, তবে আমি মনে করি যে সত্যই আপনাকে পাইথনটিতে এটি করা উচিত নয় এমন একটি সতর্কতা দিয়ে শুরু করা উচিত। এটি যেমন রয়েছে, অনুমানটি যাচাই করে দেখা যাচ্ছে যে এটি একটি "পাইথনে করণীয় বিষয়" যা এটি নয়।
জন কমস

4
এগুলি পাইথন 2 উত্তর। উদাহরণস্বরূপ, পাইথন 3 তে কোনও বেসস্ট্রিং নেই।
dfrankow

4
উদাহরণ এবং "ঠিক" এর মধ্যে পার্থক্য কী? যদি type(a) is Objectতা হয় তবে এটিও সত্য নয় isinstance(a, Object)। তবে, type(a) is SubClassOfObjectতবে type(a) is Object == False, তবে isinstance(a, Object) == True। রাইট?
mavavilj

1
@ মামাভিলজ - এর a is bঅর্থ a এবং b হ'ল একই জিনিস, অর্থাত স্মৃতিতে একই সত্তার উল্লেখ। সুতরাং aএবং bঠিক একই শ্রেণি হতে হবে, সাবক্লাস হিসাবে নয় isinstance()। উদাহরণস্বরূপ দেখুন স্ট্যাকওভারফ্লো.com
টেরি ব্রাউন

195

সবচেয়ে একটি বস্তুর টাইপ চেক করতে Pythonic উপায় এটা চেক করতে নয় ...।

পাইথন যেহেতু হাঁসের টাইপিংকে উত্সাহ দেয় , তাই আপনি try...exceptযেভাবে অবজেক্টের পদ্ধতিগুলি ব্যবহার করতে চান তা ব্যবহার করা উচিত। সুতরাং যদি আপনার ফাংশন কোনও লিখনযোগ্য ফাইল অবজেক্টের সন্ধান করে, এটি একটি সাবক্লাস যাচাই করবেন নাfile , কেবল তার .write()পদ্ধতিটি ব্যবহার করার চেষ্টা করুন !

অবশ্যই, কখনও কখনও এই দুর্দান্ত বিমূর্ততাগুলি ভেঙে যায় এবং isinstance(obj, cls)এটি আপনার প্রয়োজন। তবে অল্প পরিমাণে ব্যবহার করুন।


75
আইএমএইচও, সর্বাধিক পাইথোনিক উপায় হ'ল যুক্তি যা দেওয়া হয় তা মোকাবেলা করা। আমার কোডে আমি প্রায়শই জানতে পারি না আমি কোনও বস্তু বা বস্তুর একটি অ্যারে পেয়েছি কিনা এবং আমি একক বস্তুকে এক-উপাদান তালিকায় রূপান্তর করতে অভ্যন্তরীণভাবে টাইপ-চেকিং ব্যবহার করি।
সস্তানিন

14
তারপরে কেবল তার লেখার পদ্ধতিটি ব্যবহার করার চেষ্টা করার সময় আপনি যখন কোনও ব্যতিক্রম ঘটায় না করে এটি করতে চান তখন সময় আসে। এই ক্ষেত্রে আপনি করতে পারেন ... if hasattr(ob, "write") and callable(ob.write): বা কিছু ডিক অ্যাক্সেস সংরক্ষণ করুন ...func = getattr(ob, "write", None) if callable(func): ...
ধারণাগুলি 42

142
হাঁসের টাইপিং একটি লাইব্রেরি ব্যবহার সম্পর্কে । টাইপ চেকিং একটি লাইব্রেরি লেখার বিষয়ে । একই সমস্যা ডোমেন নয়।
রিকিয়া

16
@ রিকিএ, আমি একমত নই হাঁসের টাইপিং সুপরিচিত শব্দার্থবিজ্ঞানের সাথে ইন্টারফেস ব্যবহার করে অবজেক্টগুলির সাথে আলাপচারিতা সম্পর্কে। এটি লাইব্রেরি কোডে বা এমন লাইব্রেরি ব্যবহার করা কোডে প্রয়োগ করতে পারে।
ড্যান লেন্সকি

6
@ nyuszika7h, পাইথন 3-এ hasattrকেবল একটি অ্যাট্রিবিউটআরারকেই সুপারপ্রেস করেছেন
ফাংশনস.চ.টি.এমএল#

56

isinstance(o, str)ফিরে আসবে Trueযদি oএকটি হয় strবা একটি টাইপ যে থেকে উত্তরাধিকারী হয় str

type(o) is strTrueকেবলমাত্র যদি oস্ট্র থাকে তবে ফিরে আসবে । এটি Falseযদি oএমন কোনও ধরণের হয়ে থাকে যা থেকে উত্তরাধিকার সূত্রে আসে str


6
অবশ্যই এটি ব্যর্থ হবে যদি বস্তুটি 'আরআর' এর উদাহরণ নয়, তবে পরিবর্তে স্ট্রিং-জাতীয় কিছু। ইউনিকোড, এমএমএপ, ইউজারস্ট্রিং বা অন্য কোনও ব্যবহারকারী-সংজ্ঞায়িত টাইপের মতো। পাইথনে স্বাভাবিক পদ্ধতিটি টাইপচেকগুলি না করা।
থমাস ওয়াউটারস

6
আপনাকে ক্ষমা চাইতে হবে না, আপনার নিজের প্রশ্নের উত্তর দেওয়া ঠিক OK তাই উত্তরের জন্য, কর্মফল নয়।
এলি বেন্ডারস্কি

2
এটি খুব সহায়ক। কারণ এর মধ্যে পার্থক্য isinstanceএবং type(var) == type('')স্পষ্ট নয়।
সাস্টানিন

29

প্রশ্ন জিজ্ঞাসা ও উত্তর দেওয়ার পরে পাইথনে টাইপ ইঙ্গিত যুক্ত করা হয়েছিল । পাইথনে টাইপ ইঙ্গিতগুলি প্রকারগুলি পরীক্ষা করার অনুমতি দেয় কিন্তু স্ট্যাটিকালি টাইপ করা ভাষা থেকে একেবারেই আলাদা 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আচরণগুলির সাথে কোনও ধরণের প্রয়োজনীয়তা নির্দিষ্ট করতে ইঙ্গিতগুলির জন্য।

টাইপ ইঙ্গিতগুলি টাইপগুলি চেক করার সর্বাধিক পাইথোনিক উপায়, তবে প্রকারটি পরীক্ষা না করা এবং হাঁসের টাইপিংয়ের উপর নির্ভর করা প্রায়শই বেশি বেশি পাইথোনিক। প্রকারের ইঙ্গিতগুলি তুলনামূলকভাবে নতুন এবং যখন জুরিটি সর্বাধিক পাইথোনিক সমাধান হয় তখনও জুরিটি বাইরে থাকে। একটি তুলনামূলকভাবে বিতর্কিত তবে খুব সাধারণ তুলনা: প্রকারের ইঙ্গিতগুলি ডকুমেন্টেশনের এমন একটি ফর্ম সরবরাহ করে যা প্রয়োগ করা যেতে পারে, কোডটি পূর্বে তৈরি করতে এবং ত্রুটিগুলি বোঝার জন্য সহজতর অনুমতি দেয়, হাঁসের টাইপিং করতে পারে না এমন ত্রুটিগুলি ধরতে পারে এবং স্ট্যাটিকভাবে পরীক্ষা করা যায় (একটি অস্বাভাবিক ক্ষেত্রে) জ্ঞান কিন্তু এটি এখনও রানটাইমের বাইরে)। অন্যদিকে, হাঁসের টাইপিং দীর্ঘকাল ধরে পাইথোনিক উপায় হয়ে দাঁড়িয়েছে, স্থির টাইপিংয়ের জ্ঞানীয় ওভারহেড চাপিয়ে দেয় না, কম ভার্জোজ, এবং সমস্ত ব্যবহার্য প্রকারভেদ গ্রহণ করবে এবং তারপরে কিছু।


2
-1: মাইপি বিশেষত নিজেকে "স্ট্যাটিক টাইপ চেকার" বলে ডাকে তাই আমি নিশ্চিত না যে আপনি কোথায় পেয়েছেন "রানটাইম সময়ে টাইপ চেকিং অবশ্যই করতে হবে"।
কেভিন

@ কেভিন পূর্ববর্তী ক্ষেত্রে, এটি একটি অপ্রয়োজনীয় স্থানান্তর ছিল, তবে আরও জানার জন্য পাইথনের ধরণের ইঙ্গিতগুলি রানটাইম ডেটাতে রূপান্তরিত হয় এবং mypyএটি একটি পাইথন মডিউল যা importlibসেই ডেটা অ্যাক্সেস করতে ব্যবহার করে। এটি "স্ট্যাটিক টাইপ চেকিং" কিনা তা দার্শনিক প্রশ্ন তবে সাধারণ ভাষার দোভাষী এবং আমদানি যন্ত্রপাতি জড়িত থাকার কারণে এটি সবচেয়ে বেশি প্রত্যাশার চেয়ে আলাদা।
প্রেক্সোলাইটিক

4
এটিও সত্য নয়। এটি টাইপড_স্ট ব্যবহার করে, যা নিজেই অতিরিক্ত বৈশিষ্ট্যযুক্ত মাত্র একটি ক্লোনঅ্যাস্ট মডিউলগুলি আমদানি করে না; এটি তাদের একটি বিমূর্ত সিনট্যাক্স ট্রিে পার্স করে।
কেভিন

17

এখানে একটি উদাহরণ যেখানে হাঁসের টাইপিং কেন বিপজ্জনক তা না জেনেই কেন টাইপিং দুষ্ট। উদাহরণস্বরূপ: পাইথন কোডটি এখানে (সম্ভবত যথাযথ ইনডেন্টিং বাদ দিচ্ছে), নোট করুন যে আপনার যখন সত্যিই একটি হাঁসের প্রয়োজন হবে তখন আপনি বোমা পাবেন না তা নিশ্চিত করার জন্য আইসনস্ট্যান্স এবং ইস্যুব্ল্যাকসোফ ফাংশনগুলির যত্ন নিয়ে এই পরিস্থিতি এড়ানো যায় 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()

36
এমনকি টাইপ চেকিংয়ের পরেও আপনি একটি class EvilDuck(Duck)ওভাররাইড টক () তৈরি করতে পারেন । বা আরও সম্ভবত, class ChineseCancerDuck(Duck)একটি বাজে পার্শ্ব প্রতিক্রিয়া সহ যা বছর পরে দেখা যায় না। আপনি কেবল আপনার বাচ্চাটির তদারকি করা থেকে ভাল হবেন (এবং তার খেলনাগুলির পুরোপুরি পরীক্ষা করা :)
ব্রেট থমাস

36
বোমা কথা বলে না। অযৌক্তিক পদ্ধতি যুক্ত করবেন না এবং এটি হবে না।
রাইটফোল্ড

7
@Dmitry, এই হাঁসের টাইপিং সাধারণ সমালোচনা হল: en.wikipedia.org/wiki/Duck_typing#Criticism ... আপনি মূলত বলছে যে কোনো ইন্টারফেস, যার জন্য শব্দার্থবিদ্যা ভাষা দ্বারা জারি করা হয় না মন্দ। আমি বিশ্বাস করি এটি জাভা সম্পর্কিত আরও বেশি পদ্ধতি। পাইথনের হাঁসের টাইপিংয়ের পুরো বিষয়টি হ'ল এটি কেবল তখনই কাজ করে যখন নির্দিষ্ট ইন্টারফেসের অর্থ কী তা সম্পর্কে সাধারণভাবে সমর্থনযোগ্য কনভেনশন হয়। উদাহরণস্বরূপ, আপনি __file__অন্য কিছু বোঝার জন্য অ্যাট্রিবিউটটি (সাধারণত ফাইল-জাতীয় বস্তু সনাক্তকরণে ব্যবহৃত) ওভাররাইড করে পাইথন কোডটি প্রচুর পরিমাণে বর্জন করতে পারেন ।
ড্যান লেন্সকি

2
এই সব পুরানো রসিকতা অবতীর্ণ হয়েছে "ডাক্তার, আমি যখন এটি করি তখন ব্যথা হয়।" ... "তাহলে তা করো না"। "যদি এটি সংকলন করে তবে এটি চালায়" এর অভ্যস্ত এমন কারও প্রতি অসন্তুষ্টিজনক, তবে সে কারণেই পরীক্ষার আবেগ গতিশীল ভাষার জগতের বাইরে বেড়ে যায়।
ক্লেক

1
ক্ল্যাকার মূলত, রানটাইমের সময় কঠোরভাবে প্রকার প্রয়োগ করা খুব ব্যয়বহুল কারণ প্রত্যেকটি জিনিস অবশ্যই একটি বস্তু হতে হবে (স্ট্রিং থেকে যে কোনও ধরণের সম্ভাব্য মানচিত্রের জন্য) এবং হাঁসচাপ না করা খুব সুবিধাজনক কারণ ডাকটাইপিং সত্যই শক্তিশালী প্রোটোটাইপিং কৌশলগুলিকে অনুমতি দেয় যা জিনিসকে কাটিয়ে ওঠে অনমনীয় ইন্টারফেসের সাথে করা সাধারণত খুব কঠিন। এছাড়াও, কোনও স্থির ভাষা এমন একটি পয়েন্টের মুখোমুখি হয় যেখানে ডায়নামিক লাইব্রেরি, মূল্যায়ন এবং স্ট্রিংফিকেশন বা ইন্টারফেসের মাধ্যমে হাঁসের টাইপিং তৈরি করা দরকার এবং এই বিষয়গুলি সহজাতভাবে এটিকে মন্দ করে না, কেবল খুব শক্তিশালী।
দিমিত্রি

12

1
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
ইকনস

7

আমি মনে করি পাইথনের মতো গতিময় ভাষা ব্যবহারের দুর্দান্ত জিনিসটি হ'ল আপনার সত্যিই এর মতো কিছু পরীক্ষা করা উচিত নয়।

আমি কেবল আপনার অবজেক্টে প্রয়োজনীয় পদ্ধতিগুলি কল করব এবং এটি ধরব AttributeError। পরবর্তীতে এর পরে আপনাকে পরীক্ষাগুলি করার জন্য কোনও বস্তুর উপহাস করার মতো বিভিন্ন কাজ সম্পাদন করতে অন্যান্য (আপাতদৃষ্টিতে সম্পর্কিত নয়) বস্তুর সাথে আপনার পদ্ধতিগুলি কল করার অনুমতি দেবে।

ওয়েব থেকে ডেটা নেওয়ার সময় আমি এটি প্রচুর ব্যবহার করেছি urllib2.urlopen()যার সাহায্যে কোনও ফাইলের মতো বস্তু ফিরে আসে । এটি কোনও ফাইল থেকে পড়া প্রায় কোনও পদ্ধতিতে পরিবর্তিত হতে পারে, কারণ এটি একই read()ফাইলটিকে আসল ফাইল হিসাবে প্রয়োগ করে ।

তবে আমি নিশ্চিত যে ব্যবহারের জন্য একটি সময় এবং জায়গা রয়েছে isinstance(), অন্যথায় সম্ভবত এটি সেখানে না থাকত :)


আপনি কখন এটি ব্যবহার করতে হবে তার একটি উত্তম উদাহরণ হ'ল আপনি যদি কোনও গতিশীল জেএসন বস্তুকে পার্স করছেন। ক্ষেত্রটি যদি স্ট্রিং বা অভিধান হয় তবে আপনি আগেই জানবেন না।
ধূসর

6

আরও জটিল ধরণের বৈধতার জন্য আমি পাইথন টাইপ ইঙ্গিত টীকাগুলির উপর ভিত্তি করে টাইপগার্ডের যাচাইকরণের পদ্ধতি পছন্দ করি :

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) 

6

আপনি একটি প্রকারের_____ ব্যবহার করে একটি পরিবর্তনশীল প্রকারের জন্য পরীক্ষা করতে পারেন।

উদা:

>>> 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'

ধন্যবাদ, আমি যখন এটি ব্যবহারকারীর প্রতিক্রিয়া হিসাবে প্রদর্শিত হচ্ছিলাম তখন এই গোপনীয় কোডটি ছিল। এটি খুঁজে পেতে আমাকে অনেক দীর্ঘ সময় নিয়েছে ...
হারুন ডি মারাকো

5

হুগোর কাছে:

আপনি সম্ভবত listএটির চেয়ে বরং এটি বোঝাতে চেয়েছেন arrayতবে এটি টাইপ চেকিংয়ের সাথে পুরো সমস্যার দিকে ইঙ্গিত করে - আপনি জানতে চাইবেন না যে প্রশ্নে থাকা বস্তুটি একটি তালিকা, আপনি জানতে চান এটি কোনও ধরণের ক্রম বা এটি কোনও একক বস্তু কিনা। সুতরাং এটি সিক্যুয়েন্সের মতো ব্যবহার করার চেষ্টা করুন।

বলুন আপনি কোনও বিদ্যমান ক্রমিকায় অবজেক্টটি যুক্ত করতে চান, বা এটি যদি কোনও বস্তুর ক্রম হয় তবে সেগুলি সমস্ত যুক্ত করুন

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

এর সাথে একটি কৌশলটি যদি আপনি স্ট্রিং এবং / অথবা স্ট্রিংয়ের ক্রমগুলি নিয়ে কাজ করছেন - তবে এটি মুশকিল, কারণ একটি স্ট্রিংটি প্রায়শই একটি একক বস্তু হিসাবে বিবেচিত হয়, তবে এটি অক্ষরেরও একটি ক্রম। এর চেয়েও খারাপ, এটি সত্যই একক দৈর্ঘ্যের স্ট্রিংগুলির ক্রম।

আমি সাধারণত আমার এপিআই ডিজাইন করতে পছন্দ করি যাতে এটি কেবলমাত্র একক মান বা সিকোয়েন্স গ্রহণ করে - এটি জিনিসগুলিকে সহজ করে তোলে। [ ]আপনার একক মানটি যখন প্রয়োজন হয় তখন এটি পাস করার পরেও এটি কঠিন নয় ।

(যদিও এটি স্ট্রিংগুলির সাথে ত্রুটি সৃষ্টি করতে পারে, যেমনটি তারা (সিকোয়েন্সগুলি) মতো দেখাচ্ছে))


0

প্রকারটি যাচাই করার একটি সহজ উপায় হ'ল এটির সাথে তুলনা করা যার প্রকার আপনি জানেন।

>>> a  = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True

-1

আমি মনে করি সর্বোত্তম উপায় হ'ল আপনার ভেরিয়েবলগুলি ভাল টাইপ করা। আপনি "টাইপিং" লাইব্রেরি ব্যবহার করে এটি করতে পারেন।

উদাহরণ:

from typing import NewType UserId = NewType ('UserId', int) some_id = UserId (524313) `

Https://docs.python.org/3/library/typing.html দেখুন


-7

প্রদত্ত মানটি কোন বর্ণচিহ্নের টাইপ তা পরীক্ষা করতে নীচের লাইনের সাহায্যে পরীক্ষা করতে পারেন:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

3
আপনি কি নিশ্চিত যে আপনি এই উত্তরটি ভেনকেটসান মুছতে চান না?
ধূসর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.