基本的に私はこれをやりたい:
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()
まず、すべての型比較を避けます。それらは、非常にまれにしか必要ありません。まれに、関数のパラメータータイプをチェックするのに役立つことがあります。間違った型のデータは例外を発生させます。それだけで十分です。
すべての基本的な変換関数は、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独自の自然多型を使用します。
他のタイプについては、 types モジュールをチェックしてください:
>>> 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)
多くの場合、特に最近の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です。
あなたはとても近いです! string
はモジュールであり、タイプではありません。おそらく、obj
の型を文字列の型オブジェクト、つまりstr
と比較する必要があります。
type(obj) == str # this works because str is already a type
代わりに:
type(obj) == type('')
Python 2では、obj
がUnicode型の場合、上記のいずれも機能しません。 isinstance()
もしません。これを回避する方法については、ジョンのこの投稿へのコメントを参照してください...私は今約10分間それを思い出そうとしていましたが、メモリブロックがありました!
書かなければならないからです
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()呼び出しを実行する前に例外を発生させます。インターフェイスチェックがなければ、ファイルを削除してから例外を発生させることになります。
文字列の代わりにstrを使用します
type ( obj ) == str
説明
>>> a = "Hello"
>>> type(a)==str
True
>>> type(a)
<type 'str'>
>>>
type(x) == type(y)
を使用します
たとえば、何かが配列であることを確認したい場合:
type( x ) == type( [] )
文字列チェック:
type( x ) == type( '' ) or type( x ) == type( u'' )
Noneに対してチェックしたい場合は、
x is None
これでうまくいくと思う
if isinstance(obj, str)
タイプは特定のクラスでは機能しません。オブジェクトのタイプがわからない場合は、__class__
メソッドを使用します。
>>>obj = 'a string'
>>>obj.__class__ == str
True
この記事も参照してください- http://www.siafoo.net/article/56
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
を使用することをお勧めします。
タイプを取得するには、__class__
のようにunknown_thing.__class__
メンバーを使用します
ダックタイピングの話は、完全に良い質問に答えないので、ここでは役に立ちません。私のアプリケーションコードでは、何かのタイプを知る必要はありませんが、オブジェクトのタイプを学習する方法があると便利です。時々、ユニットテストを検証するために実際のクラスを取得する必要があります。すべての可能なオブジェクトは同じAPIを持っていますが、正しいのは1つだけなので、アヒルのタイピングが邪魔になります。また、他の誰かのコードを保守している場合があり、どのようなオブジェクトが渡されたのかわかりません。これは、Pythonのような動的に型付けされた言語に関する私の最大の問題です。バージョン1は非常に簡単かつ迅速に開発できます。バージョン2は、特にバージョン1を作成しなかった場合、パンに苦労します。そのため、私が作成しなかった関数で作業しているとき、パラメータのタイプを知る必要がある場合があります。どのメソッドを呼び出すことができますか。
そこで__class__
パラメータが役立ちます。それが(私が知る限り)オブジェクトの型を取得するための最良の方法(おそらく唯一の方法)です。
チェックレベルのクラスを比較できます。
#!/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