মূলত আমি এটি করতে চাই:
obj = 'str'
type ( obj ) == string
আমি চেষ্টা করেছিলাম:
type ( obj ) == type ( string )
এবং এটি কার্যকর হয়নি।
এছাড়াও, অন্যান্য ধরণের সম্পর্কে কি? উদাহরণস্বরূপ, আমি প্রতিলিপি করতে পারি না NoneType
।
মূলত আমি এটি করতে চাই:
obj = 'str'
type ( obj ) == string
আমি চেষ্টা করেছিলাম:
type ( obj ) == type ( string )
এবং এটি কার্যকর হয়নি।
এছাড়াও, অন্যান্য ধরণের সম্পর্কে কি? উদাহরণস্বরূপ, আমি প্রতিলিপি করতে পারি না NoneType
।
উত্তর:
isinstance()
আপনার ক্ষেত্রে, isinstance("this is a string", str)
ফিরে আসবে True
।
আপনি এটি পড়তেও চাইতে পারেন: http://www.canonical.org/~kragen/isinstance/
isinstance
কাজ করে:
if isinstance(obj, MyClass): do_foo(obj)
তবে , মনে রাখবেন: যদি এটি হাঁসের মতো দেখায় এবং যদি এটি হাঁসের মতো মনে হয় তবে এটি একটি হাঁস।
সম্পাদনা: নন টাইপের জন্য, আপনি সহজভাবে এটি করতে পারেন:
if obj is None: obj = MyClass()
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True)
এটি "না" এর পরিবর্তে "1" প্রদান করে। কিভাবে এই কাছাকাছি পেতে?
isinstance
কিন্তু এছাড়াও পরীক্ষা None
তারপর isinstance(obj, (MyClass, type(None)))
কাজ করে। types.NoneType
পাইথন 3 থেকে সরানো হয়েছে সুতরাং এটি type(None)
উল্লেখ করার মতো পোর্টেবল নয় NoneType
।
প্রথমত, সমস্ত ধরণের তুলনা এড়ান। এগুলি খুব, খুব কমই প্রয়োজনীয়। কখনও কখনও, তারা কোনও ফাংশনে প্যারামিটারের প্রকারগুলি পরীক্ষা করতে সহায়তা করে - এমনকি এটি বিরল। ভুল ধরণের ডেটা একটি ব্যতিক্রম বাড়িয়ে তুলবে, এবং এটাই আপনার প্রয়োজন হবে।
সমস্ত মূল রূপান্তর ফাংশন টাইপ ফাংশনের সমান মানচিত্র করবে।
type(9) is int
type(2.5) is float
type('x') is str
type(u'x') is unicode
type(2+3j) is complex
আরও কয়েকটি মামলা রয়েছে।
isinstance( 'x', basestring )
isinstance( u'u', basestring )
isinstance( 9, int )
isinstance( 2.5, float )
isinstance( (2+3j), complex )
বিটিডাব্লু, কেউই কখনও এ জাতীয় ধরণের পরীক্ষার প্রয়োজন হয় না। কোনওটিই ননটাইপ-এর একমাত্র উদাহরণ নয়। দ্য নন অবজেক্টটি সিঙ্গলটন is শুধু কারও জন্য পরীক্ষা করুন
variable is None
বিটিডব্লিউ, উপরেরটি সাধারণভাবে ব্যবহার করবেন না। সাধারণ ব্যতিক্রম এবং পাইথনের নিজস্ব প্রাকৃতিক বহুকর্ম ব্যবহার করুন।
NoneType
। একটি পরামিতি একটি , বা str
, হতে পারে কি ? চেক তুলনায় অনেক ক্লিনার । যদি আপনি বিলম্বিত গণনার জন্য সরঞ্জাম তৈরি করছেন, বা আপনি যদি দীর্ঘ বা সংস্থান-নিবিড় প্রক্রিয়া চালু করতে চলেছেন তবে কিছু কাস্টম বৈধকরণের পদক্ষেপের আগে সময়ের আগে ত্রুটিগুলি ধরা মূল্যবান । এটি আমি প্রায় কাজ করেছি এমন প্রায় প্রতিটি বৈজ্ঞানিক কম্পিউটিং প্রকল্পের একটি সমালোচনামূলক অঙ্গ হয়ে উঠেছে। আমি যে সমস্ত দেব প্রকল্প দেখেছি তার মধ্যে এর চেয়ে বেশি বেশি এর প্রয়োজন ছিল have unicode
None
isinstance(x, (str, unicode, types.NoneType))
None
type
অন্যান্য ধরণের জন্য, প্রকারের মডিউলটি পরীক্ষা করে দেখুন :
>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True
পিএস টাইপচেকিং একটি খারাপ ধারণা।
আপনি সর্বদা type(x) == type(y)
কৌশলটি ব্যবহার করতে পারেন , যেখানে y
পরিচিত ধরণের কিছু রয়েছে।
# check if x is a regular string
type(x) == type('')
# check if x is an integer
type(x) == type(1)
# check if x is a NoneType
type(x) == type(None)
প্রায়শই এটি করার আরও ভাল উপায় রয়েছে, বিশেষত সাম্প্রতিক কোনও অজগর দিয়ে। তবে আপনি যদি কেবল একটি জিনিস মনে রাখতে চান তবে আপনি এটি মনে রাখতে পারেন।
এই ক্ষেত্রে, আরও ভাল উপায়গুলি হ'ল:
# check if x is a regular string
type(x) == str
# check if x is either a regular string or a unicode string
type(x) in [str, unicode]
# alternatively:
isinstance(x, basestring)
# check if x is an integer
type(x) == int
# check if x is a NoneType
x is None
শেষ কেসটি লক্ষ করুন: NoneType
অজগরটিতে কেবলমাত্র একটি উদাহরণ রয়েছে এবং তা হ'ল None
। আপনি ব্যতিক্রমগুলিতে অনেক কিছুই ননটাইপ দেখতে পাবেন ( TypeError: 'NoneType' object is unsubscriptable
- আমার সাথে সর্বদা ঘটে থাকে ..) তবে আপনাকে কোডের সাথে এটি উল্লেখ করার পক্ষে খুব কমই দরকার।
পরিশেষে, ফেংসশাউনটি নির্দেশ করে, পাইথনে টাইপ চেক করা সবসময় ভাল ধারণা নয়। মানটি কেবলমাত্র আপনার প্রত্যাশার প্রকারের মতোই ব্যবহার করা এবং এটি থেকে প্রাপ্ত ব্যতিক্রমগুলি ধরা (বা প্রচারের অনুমতি দেওয়া) হিসাবে এটি আরও অজগর।
তুমি খুব কাছে! string
একটি মডিউল, একটি টাইপ নয়। আপনি সম্ভবত obj
স্ট্রিংয়ের জন্য টাইপ অবজেক্টের সাথে প্রকারের তুলনা করতে চান , যথা str
:
type(obj) == str # this works because str is already a type
বিকল্পভাবে:
type(obj) == type('')
দ্রষ্টব্য, পাইথন 2-তে, যদি obj
কোনও ইউনিকোড টাইপ হয়, তবে উপরের কোনওটিই কাজ করবে না। না হবে isinstance()
। কীভাবে এটি পাওয়া যায় তার জন্য এই পোস্টে জন এর মন্তব্য দেখুন ... আমি এখন প্রায় 10 মিনিট ধরে এটি মনে রাখার চেষ্টা করছি, কিন্তু একটি স্মৃতিশক্তি ছিল!
কারণ আপনাকে লিখতে হবে
s="hello"
type(s) == type("")
প্রকারটি উদাহরণ গ্রহণ করে এবং তার প্রকারটি প্রদান করে। এই ক্ষেত্রে আপনাকে দুটি দৃষ্টান্তের প্রকারের তুলনা করতে হবে।
আপনার যদি প্রিমিপটিভ চেকিং করার দরকার হয় তবে আপনি যদি প্রকারের চেয়ে সমর্থিত ইন্টারফেসের জন্য পরীক্ষা করেন তবে ভাল।
আপনার কোডটি একটি নির্দিষ্ট ধরণের উদাহরণ চায় তা বাদে প্রকৃতপক্ষে আপনাকে বেশি কিছু জানায় না, আপনার ভিন্ন ভিন্ন ধরণের অন্য কোনও উদাহরণ থাকতে পারে যা পুরোপুরি সূক্ষ্ম হবে কারণ এটি একই ইন্টারফেসটি প্রয়োগ করে ।
উদাহরণস্বরূপ, ধরুন আপনার কাছে এই কোড রয়েছে
def firstElement(parameter):
return parameter[0]
এখন, ধরুন আপনি বলেছেন: আমি এই কোডটি কেবল একটি টুপল গ্রহণ করতে চাই।
import types
def firstElement(parameter):
if type(parameter) != types.TupleType:
raise TypeError("function accepts only a tuple")
return parameter[0]
এটি এই রুটিনটির পুনরায় ব্যবহারযোগ্যতা হ্রাস করছে। আপনি একটি তালিকা, বা একটি স্ট্রিং, বা একটি numpy.array পাস করলে এটি কাজ করবে না। আরও ভাল কিছু হবে
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
return parameter[0]
তবে এটি করার কোনও অর্থ নেই: প্যারামিটার [0] ব্যতিক্রম উত্থাপন করবে যদি প্রোটোকলটি যাইহোক সন্তুষ্ট না হয় ... অবশ্যই আপনি যদি পার্শ্ব প্রতিক্রিয়া প্রতিরোধ করতে না চান বা কলগুলি যে আপনি ব্যর্থ হওয়ার আগে অনুরোধ করতে পারতেন তা পুনরুদ্ধার করতে না চান। (বোকামি) উদাহরণস্বরূপ, কেবলমাত্র বিষয়টি বলতে:
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
os.system("rm file")
return parameter[0]
এই ক্ষেত্রে, আপনার কোড সিস্টেম () কল চালানোর আগে একটি ব্যতিক্রম বাড়িয়ে তুলবে। ইন্টারফেস চেক না করে আপনি ফাইলটি সরিয়ে ফেলতেন, এবং তারপরে ব্যতিক্রমটি উত্থাপন করতে পারেন।
আমি ব্যবহার করি type(x) == type(y)
উদাহরণস্বরূপ, আমি যদি কিছু পরীক্ষা করতে চাই তবে এটি একটি অ্যারে:
type( x ) == type( [] )
স্ট্রিং চেক:
type( x ) == type( '' ) or type( x ) == type( u'' )
আপনি যদি কারও বিরুদ্ধে চেক করতে চান তবে ব্যবহার হয়
x is None
প্রকার নির্দিষ্ট ক্লাসে কাজ করে না। আপনি যদি অবজেক্টের ধরণের বিষয়ে নিশ্চিত না হন তবে __class__
পদ্ধতিটি ব্যবহার করুন :
>>>obj = 'a string'
>>>obj.__class__ == str
True
এছাড়াও এই নিবন্ধটি দেখুন - http://www.siafoo.net/article/56
প্রকারটি পেতে, __class__
সদস্য হিসাবে ব্যবহার করুন useunknown_thing.__class__
হাঁস-টাইপিংয়ের কথা এখানে অকেজো কারণ এটি পুরোপুরি ভাল প্রশ্নের উত্তর দেয় না। আমার অ্যাপ্লিকেশন কোডে আমার কখনই কোনও কিছুর ধরণের জানা প্রয়োজন না, তবে কোনও অবজেক্টের ধরণ শিখার উপায় থাকা এখনও কার্যকর। কখনও কখনও ইউনিট পরীক্ষাটি বৈধ করার জন্য আমার আসল ক্লাস নেওয়া দরকার। হাঁসের টাইপিংয়ের পথে সেখানে যায় কারণ সমস্ত সম্ভাব্য বস্তুর একই API রয়েছে তবে কেবল একটি সঠিক only এছাড়াও, কখনও কখনও আমি অন্য কারও কোড বজায় রাখছি এবং আমি জানি না আমি কী ধরণের অবজেক্টটি পাস করেছি। পাইথনের মতো গতিময় টাইপ করা ভাষাগুলি নিয়ে এটি আমার বৃহত্তম সমস্যা। সংস্করণ 1 খুব সহজ এবং দ্রুত বিকাশমান। সংস্করণ 2 হ'ল ব্যানগুলির মধ্যে ব্যথা, বিশেষত আপনি যদি সংস্করণ 1 না লিখে থাকেন sometimes
যে যেখানে আছে __class__
প্যারামিটার উপকারে আসে। এটি (যতদূর আমি বলতে পারি) কোনও অবজেক্টের ধরণ পাওয়ার সেরা উপায় (সম্ভবত একমাত্র উপায়)।
ব্যবহার isinstance(object, type)
। উপরে হিসাবে এটি ব্যবহার করা সহজ যদি আপনি সঠিক জানেন তবে type
,
isinstance('dog', str) ## gives bool True
তবে আরও মজাদার জিনিসগুলির জন্য এটি ব্যবহার করা কঠিন can উদাহরণ স্বরূপ:
import numpy as np
a = np.array([1,2,3])
isinstance(a,np.array) ## breaks
তবে আপনি এই কৌশলটি করতে পারেন:
y = type(np.array([1]))
isinstance(a,y) ## gives bool True
তাই আমি একটি পরিবর্তনশীল (শুরু করতে গিয়ে সুপারিশ y
বস্তুর আপনি চেক করতে চান এক ধরনের সঙ্গে এই ক্ষেত্রে) (যেমন, type(np.array())
), তারপর ব্যবহার isinstance
।
আপনি চেক স্তরের জন্য ক্লাস তুলনা করতে পারেন।
#!/usr/bin/env python
#coding:utf8
class A(object):
def t(self):
print 'A'
def r(self):
print 'rA',
self.t()
class B(A):
def t(self):
print 'B'
class C(A):
def t(self):
print 'C'
class D(B, C):
def t(self):
print 'D',
super(D, self).t()
class E(C, B):
pass
d = D()
d.t()
d.r()
e = E()
e.t()
e.r()
print isinstance(e, D) # False
print isinstance(e, E) # True
print isinstance(e, C) # True
print isinstance(e, B) # True
print isinstance(e, (A,)) # True
print e.__class__ >= A, #False
print e.__class__ <= C, #False
print e.__class__ < E, #False
print e.__class__ <= E #True
type(obj) == str