পাইথনে কোনও বস্তুর প্রকারের তুলনা কীভাবে করা যায়?


163

মূলত আমি এটি করতে চাই:

obj = 'str'
type ( obj ) == string

আমি চেষ্টা করেছিলাম:

type ( obj ) == type ( string )

এবং এটি কার্যকর হয়নি।

এছাড়াও, অন্যান্য ধরণের সম্পর্কে কি? উদাহরণস্বরূপ, আমি প্রতিলিপি করতে পারি না NoneType


এটি কাজ করেtype(obj) == str
জোশুয়া ভার্গিজ 13

উত্তর:


241
isinstance()

আপনার ক্ষেত্রে, isinstance("this is a string", str)ফিরে আসবে True

আপনি এটি পড়তেও চাইতে পারেন: http://www.canonical.org/~kragen/isinstance/


4
আমি বলব আপনার (ওপি) অবশ্যই রেফারেন্সযুক্ত লিঙ্কটি পড়া উচিত , যা কোনও সামগ্রীর প্রকারটি পরীক্ষা করা কেন সাধারণত একটি খারাপ ধারণা এবং এর পরিবর্তে আপনার সম্ভবত কী করা উচিত সে সম্পর্কে প্রচুর বিবরণ দেয়।
জেফ শ্যানন

2
আপনার স্ট্রিং নয়, বেসস্ট্রার ব্যবহার করা উচিত। অন্যথায় আপনি ইউনিকোড বাছাই করবেন না। (যদিও 3.x জন্য আমি মনে করি Str হয় basestr)
hasen

36

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" প্রদান করে। কিভাবে এই কাছাকাছি পেতে?
dig_123

আপনি ব্যবহার করতে চান তাহলে isinstanceকিন্তু এছাড়াও পরীক্ষা Noneতারপর isinstance(obj, (MyClass, type(None)))কাজ করে। types.NoneTypeপাইথন 3 থেকে সরানো হয়েছে সুতরাং এটি type(None)উল্লেখ করার মতো পোর্টেবল নয় NoneType
সানটারি পাওলোইনেন

33

প্রথমত, সমস্ত ধরণের তুলনা এড়ান। এগুলি খুব, খুব কমই প্রয়োজনীয়। কখনও কখনও, তারা কোনও ফাংশনে প্যারামিটারের প্রকারগুলি পরীক্ষা করতে সহায়তা করে - এমনকি এটি বিরল। ভুল ধরণের ডেটা একটি ব্যতিক্রম বাড়িয়ে তুলবে, এবং এটাই আপনার প্রয়োজন হবে।

সমস্ত মূল রূপান্তর ফাংশন টাইপ ফাংশনের সমান মানচিত্র করবে।

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

বিটিডব্লিউ, উপরেরটি সাধারণভাবে ব্যবহার করবেন না। সাধারণ ব্যতিক্রম এবং পাইথনের নিজস্ব প্রাকৃতিক বহুকর্ম ব্যবহার করুন।


3
আপনি যদি কোনও ডিএসএল থেকে ইনপুটগুলি বৈধতা দিয়ে থাকেন তবে আপনার এমনকি এগুলিও দরকার NoneType। একটি পরামিতি একটি , বা str, হতে পারে কি ? চেক তুলনায় অনেক ক্লিনার । যদি আপনি বিলম্বিত গণনার জন্য সরঞ্জাম তৈরি করছেন, বা আপনি যদি দীর্ঘ বা সংস্থান-নিবিড় প্রক্রিয়া চালু করতে চলেছেন তবে কিছু কাস্টম বৈধকরণের পদক্ষেপের আগে সময়ের আগে ত্রুটিগুলি ধরা মূল্যবান । এটি আমি প্রায় কাজ করেছি এমন প্রায় প্রতিটি বৈজ্ঞানিক কম্পিউটিং প্রকল্পের একটি সমালোচনামূলক অঙ্গ হয়ে উঠেছে। আমি যে সমস্ত দেব প্রকল্প দেখেছি তার মধ্যে এর চেয়ে বেশি বেশি এর প্রয়োজন ছিল have unicodeNoneisinstance(x, (str, unicode, types.NoneType))Nonetype
ely

23

অন্যান্য ধরণের জন্য, প্রকারের মডিউলটি পরীক্ষা করে দেখুন :

>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True

পিএস টাইপচেকিং একটি খারাপ ধারণা।


15

আপনি সর্বদা 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- আমার সাথে সর্বদা ঘটে থাকে ..) তবে আপনাকে কোডের সাথে এটি উল্লেখ করার পক্ষে খুব কমই দরকার।

পরিশেষে, ফেংসশাউনটি নির্দেশ করে, পাইথনে টাইপ চেক করা সবসময় ভাল ধারণা নয়। মানটি কেবলমাত্র আপনার প্রত্যাশার প্রকারের মতোই ব্যবহার করা এবং এটি থেকে প্রাপ্ত ব্যতিক্রমগুলি ধরা (বা প্রচারের অনুমতি দেওয়া) হিসাবে এটি আরও অজগর।


1
এটির মূল্য কী, এর জন্য আইসনস্ট্যান্স () পাইথনের টাইপগুলি পরীক্ষা করার পছন্দের উপায় (যখন আপনাকে এটি করতে হবে)।
ডেভিড জেড

6

তুমি খুব কাছে! stringএকটি মডিউল, একটি টাইপ নয়। আপনি সম্ভবত objস্ট্রিংয়ের জন্য টাইপ অবজেক্টের সাথে প্রকারের তুলনা করতে চান , যথা str:

type(obj) == str  # this works because str is already a type

বিকল্পভাবে:

type(obj) == type('')

দ্রষ্টব্য, পাইথন 2-তে, যদি objকোনও ইউনিকোড টাইপ হয়, তবে উপরের কোনওটিই কাজ করবে না। না হবে isinstance()। কীভাবে এটি পাওয়া যায় তার জন্য এই পোস্টে জন এর মন্তব্য দেখুন ... আমি এখন প্রায় 10 মিনিট ধরে এটি মনে রাখার চেষ্টা করছি, কিন্তু একটি স্মৃতিশক্তি ছিল!


2
স্ট্রিং এবং ইউনিকোড উভয়ই পেতে আইসনস্ট্যান্স () সহ বেসস্ট্রিং ব্যবহার করুন।
জন ফুহি

5

কারণ আপনাকে লিখতে হবে

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]

এই ক্ষেত্রে, আপনার কোড সিস্টেম () কল চালানোর আগে একটি ব্যতিক্রম বাড়িয়ে তুলবে। ইন্টারফেস চেক না করে আপনি ফাইলটি সরিয়ে ফেলতেন, এবং তারপরে ব্যতিক্রমটি উত্থাপন করতে পারেন।


ইন্টারফেসগুলি পরীক্ষা করার জন্য প্রকৃত পছন্দসই উপায় নির্দেশ করার জন্য ধন্যবাদ Thanks এখানে উত্তরগুলির মধ্যে অনেকগুলি এটি উল্লেখ করে তবে কয়েকটি পরিবর্তে ভাল কি তার উদাহরণ দেয়। এটি এখনও আমার ব্যক্তিগত প্রশ্নের সরাসরি উত্তর দেয় না (আমি স্ট্রিং থেকে অনেকগুলি অর্থপূর্ণ আইটেম যুক্ত স্ট্রিংয়ের একটি তালিকা আলাদা করার চেষ্টা করছি, যার মধ্যে অনেকগুলি অর্থবহ আইটেম নয় contains ধন্যবাদ!
নিক

5

স্ট্রিংয়ের পরিবর্তে str ব্যবহার করুন

type ( obj ) == str

ব্যাখ্যা

>>> a = "Hello"
>>> type(a)==str
True
>>> type(a)
<type 'str'>
>>>

4

আমি ব্যবহার করি type(x) == type(y)

উদাহরণস্বরূপ, আমি যদি কিছু পরীক্ষা করতে চাই তবে এটি একটি অ্যারে:

type( x ) == type( [] )

স্ট্রিং চেক:

type( x ) == type( '' ) or type( x ) == type( u'' )

আপনি যদি কারও বিরুদ্ধে চেক করতে চান তবে ব্যবহার হয়

x is None

তাই না? কেন এটি সাধারণভাবে খারাপ ধারণা? স্ট্রিংগুলির জন্য এটি কেবলমাত্র খারাপ ধারণা (3.0 পূর্বের জন্য) কারণ স্ট্রিং এবং ইউনিকোড দুটি ধরণের স্ট্রিং রয়েছে। অ্যারেগুলির জন্য, এটি একটি ভাল ধারণা ইমো।
হাসেন

@ হাসেন: এটি সামগ্রিকভাবে একটি খারাপ ধারণা। যদি আমি আমার নিজস্ব ধরণের সংজ্ঞা দেয় যা অ্যারের মতো আচরণ করে তবে বলুন, একটি ডাটাবেস থেকে মানগুলি নিয়ে আসে? আপনার কোডটি বিনা কারণে আমার প্রকারের সাথে ব্যর্থ হবে।
nosklo

@ হেসেন: সর্বাধিক ভোট দেওয়া (+7) উত্তরটির লিঙ্কটি canonical.org/~kragen/isinstance পড়ুন , ভোল্ট্রনউ দ্বারা
নসক্লো

1
ঠিক আছে, প্রকারটি পরীক্ষা করার পুরো কারণটি (আমার পক্ষে ন্যূনতম) ঠিক কারণ হ'ল আমি অন্যান্য ধরণের (অ্যারে অনুকরণকারী প্রকারগুলি সহ) ভিন্নভাবে অ্যারেগুলি ব্যবহার করতে চাই।
হাসেন

2
আপনি ভুল. আমি আপনাকে একটি দৃ concrete় উদাহরণ দেব: জাঙ্গোতে একটি টেম্পলেট রেন্ডারিং শর্টকাট রয়েছে যা স্ট্রিং বা স্ট্রিংগুলির একটি অ্যারে গ্রহণ করতে পারে। এখন, উভয় স্ট্রিং এবং অ্যারে (তালিকা) পুনরাবৃত্তিযোগ্য তবে এই ক্ষেত্রে, ফাংশনগুলির মধ্যে তাদের মধ্যে পার্থক্য করা প্রয়োজন।
হাসেন


2

প্রকার নির্দিষ্ট ক্লাসে কাজ করে না। আপনি যদি অবজেক্টের ধরণের বিষয়ে নিশ্চিত না হন তবে __class__পদ্ধতিটি ব্যবহার করুন :

>>>obj = 'a string'
>>>obj.__class__ == str
True

এছাড়াও এই নিবন্ধটি দেখুন - http://www.siafoo.net/article/56


2

প্রকারটি পেতে, __class__সদস্য হিসাবে ব্যবহার করুন useunknown_thing.__class__

হাঁস-টাইপিংয়ের কথা এখানে অকেজো কারণ এটি পুরোপুরি ভাল প্রশ্নের উত্তর দেয় না। আমার অ্যাপ্লিকেশন কোডে আমার কখনই কোনও কিছুর ধরণের জানা প্রয়োজন না, তবে কোনও অবজেক্টের ধরণ শিখার উপায় থাকা এখনও কার্যকর। কখনও কখনও ইউনিট পরীক্ষাটি বৈধ করার জন্য আমার আসল ক্লাস নেওয়া দরকার। হাঁসের টাইপিংয়ের পথে সেখানে যায় কারণ সমস্ত সম্ভাব্য বস্তুর একই API রয়েছে তবে কেবল একটি সঠিক only এছাড়াও, কখনও কখনও আমি অন্য কারও কোড বজায় রাখছি এবং আমি জানি না আমি কী ধরণের অবজেক্টটি পাস করেছি। পাইথনের মতো গতিময় টাইপ করা ভাষাগুলি নিয়ে এটি আমার বৃহত্তম সমস্যা। সংস্করণ 1 খুব সহজ এবং দ্রুত বিকাশমান। সংস্করণ 2 হ'ল ব্যানগুলির মধ্যে ব্যথা, বিশেষত আপনি যদি সংস্করণ 1 না লিখে থাকেন sometimes

যে যেখানে আছে __class__প্যারামিটার উপকারে আসে। এটি (যতদূর আমি বলতে পারি) কোনও অবজেক্টের ধরণ পাওয়ার সেরা উপায় (সম্ভবত একমাত্র উপায়)।


2

ব্যবহার 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


0

আপনি চেক স্তরের জন্য ক্লাস তুলনা করতে পারেন।

#!/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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.