web-dev-qa-db-ja.com

Pythonでオブジェクトのタイプを比較する方法は?

基本的に私はこれをやりたい:

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

私は試した:

type ( obj ) == type ( string )

うまくいきませんでした。

また、他のタイプはどうですか?たとえば、NoneTypeを複製できませんでした。

149
Joan Venge
isinstance()

あなたの場合、isinstance("this is a string", str)Trueを返します。

これを読むこともできます: http://www.canonical.org/~kragen/isinstance/

218
anthony

isinstance動作:

if isinstance(obj, MyClass): do_foo(obj)

しかし、覚えておいてください:それがアヒルのように見える場合、そしてそれがアヒルのように聞こえる場合、それはアヒルです。

編集:[なし]タイプの場合は、次の操作を実行できます。

if obj is None: obj = MyClass()
35
fengshaun

まず、すべての型比較を避けます。それらは、非常にまれにしか必要ありません。まれに、関数のパラメータータイプをチェックするのに役立つことがあります。間違った型のデータは例外を発生させます。それだけで十分です。

すべての基本的な変換関数は、type関数と同等にマップされます。

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 )

なし、ところで、この種の型チェックは一切必要ありません。 NoneはNoneTypeの唯一のインスタンスです。 Noneオブジェクトはシングルトンです。なしを確認してください

variable is None

ところで、一般的に上記を使用しないでください。通常の例外とPython独自の自然多型を使用します。

32
S.Lott

他のタイプについては、 types モジュールをチェックしてください:

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

追伸型チェックは悪い考えです。

23

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)

多くの場合、特に最近のpythonを使用する場合、それを行うためのより良い方法があります。ただし、1つだけ覚えておきたい場合は、それを思い出すことができます。

この場合、より良い方法は次のとおりです。

# 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

最後のケースに注意してください。PythonにはNoneTypeのインスタンスが1つだけあり、それはNoneです。例外ではNoneTypeが頻繁に表示されます(TypeError: 'NoneType' object is unsubscriptable-いつも私に起こります..)でも、コードでそれを参照する必要はほとんどありません。

最後に、fengshaunが指摘しているように、pythonのタイプチェックは常に良いアイデアとは限りません。期待どおりの型であるかのように値を使用し、その結果生じる例外をキャッチ(または伝播を許可)する方が、よりPythonicです。

14
John Fouhy

あなたはとても近いです! stringはモジュールであり、タイプではありません。おそらく、objの型を文字列の型オブジェクト、つまりstrと比較する必要があります。

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

代わりに:

type(obj) == type('')

Python 2では、objがUnicode型の場合、上記のいずれも機能しません。 isinstance()もしません。これを回避する方法については、ジョンのこの投稿へのコメントを参照してください...私は今約10分間それを思い出そうとしていましたが、メモリブロックがありました!

6
Jarret Hardie

書かなければならないからです

s="hello"
type(s) == type("")

typeはインスタンスを受け入れ、そのタイプを返します。この場合、2つのインスタンスのタイプを比較する必要があります。

プリエンプティブチェックを行う必要がある場合は、タイプよりもサポートされているインターフェイスをチェックする方が適切です。

同じインターフェイスを実装しているので完全に問題のない完全に異なるタイプの別のインスタンスを使用できるという事実に関係なく、コードは特定のタイプのインスタンスを必要とするという事実を除けば、実際には多くを伝えません。

たとえば、次のコードがあるとします

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]

しかし、それを行う意味はありません。プロトコルがとにかく満たされない場合、parameter [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]

この場合、コードはsystem()呼び出しを実行する前に例外を発生させます。インターフェイスチェックがなければ、ファイルを削除してから例外を発生させることになります。

5
Stefano Borini

文字列の代わりにstrを使用します

type ( obj ) == str

説明

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

type(x) == type(y)を使用します

たとえば、何かが配列であることを確認したい場合:

type( x ) == type( [] )

文字列チェック:

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

Noneに対してチェックしたい場合は、

x is None
4
hasen

これでうまくいくと思う

if isinstance(obj, str)
2
Aziz

タイプは特定のクラスでは機能しません。オブジェクトのタイプがわからない場合は、__class__メソッドを使用します。

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

この記事も参照してください- http://www.siafoo.net/article/56

2
Toby Fernsler

isinstance(object, type)を使用します。上記のように、正しいtypeを知っていれば、これは使いやすいです。たとえば、

isinstance('dog', str) ## gives bool True

しかし、より難解なオブジェクトの場合、これは使いにくい場合があります。例えば:

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 

したがって、チェックするオブジェクトのタイプ(たとえば、type(np.array()))で変数(この場合はy)をインスタンス化し、isinstanceを使用することをお勧めします。

1
travelingbones

タイプを取得するには、__class__のようにunknown_thing.__class__メンバーを使用します

ダックタイピングの話は、完全に良い質問に答えないので、ここでは役に立ちません。私のアプリケーションコードでは、何かのタイプを知る必要はありませんが、オブジェクトのタイプを学習する方法があると便利です。時々、ユニットテストを検証するために実際のクラスを取得する必要があります。すべての可能なオブジェクトは同じAPIを持っていますが、正しいのは1つだけなので、アヒルのタイピングが邪魔になります。また、他の誰かのコードを保守している場合があり、どのようなオブジェクトが渡されたのかわかりません。これは、Pythonのような動的に型付けされた言語に関する私の最大の問題です。バージョン1は非常に簡単かつ迅速に開発できます。バージョン2は、特にバージョン1を作成しなかった場合、パンに苦労します。そのため、私が作成しなかった関数で作業しているとき、パラメータのタイプを知る必要がある場合があります。どのメソッドを呼び出すことができますか。

そこで__class__パラメータが役立ちます。それが(私が知る限り)オブジェクトの型を取得するための最良の方法(おそらく唯一の方法)です。

1
MiguelMunoz

チェックレベルのクラスを比較できます。

#!/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
0
quickes