198

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

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

私は試した:

type ( obj ) == type ( string )

そしてそれはうまくいきませんでした。

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

4

14 に答える 14

289
isinstance()

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

こちらもお読みください: http://www.canonical.org/~kragen/isinstance/

于 2009-04-01T23:07:02.120 に答える
39

isinstance作品:

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

ただし、注意してください。アヒルのように見え、アヒルのように聞こえる場合、それはアヒルです。

編集: None タイプの場合、次のように簡単に実行できます。

if obj is None: obj = MyClass()
于 2009-04-01T23:26:47.347 に答える
24

他のタイプについては、タイプモジュールを確認してください。

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

PSタイプチェックは悪い考えです。

于 2009-04-01T23:19:36.647 に答える
19

あなたはいつでもtype(x) == type(y)トリックを使うことができます.where yis something with known type.

# 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

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

最後に、fengshaun が指摘しているように、Python での型チェックは必ずしも良い考えではありません。期待する型であるかのように値を使用し、それから生じる例外をキャッチ (または伝播を許可) する方がより Pythonic です。

于 2009-04-02T00:01:28.137 に答える
8

あなたはとても近いです!string型ではなくモジュールです。objの型を文字列の型オブジェクトと比較したい場合があります。つまり、次のようになりますstr

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

または:

type(obj) == type('')

Python 2 では、objが Unicode タイプの場合、上記のいずれも機能しないことに注意してください。しませんisinstance()。これを回避する方法については、この投稿に対する John のコメントを参照してください... 約 10 分間覚えようとしてきましたが、メモリ ブロックが発生していました。

于 2009-04-01T23:06:36.850 に答える
7

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

type ( obj ) == str

説明

>>> a = "Hello"
>>> type(a)==str
True
>>> type(a)
<type 'str'>
>>>
于 2013-02-09T10:48:30.567 に答える
2

私はこれがそれをするべきだと思います

if isinstance(obj, str)
于 2009-04-01T23:07:49.063 に答える
2

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

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

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

于 2012-04-06T21:34:25.267 に答える
2

型を取得するには、次のように__class__メンバーを使用します。unknown_thing.__class__

ダックタイピングの話は、ここでは役に立たない。私のアプリケーション コードでは、何かの型を知る必要はありませんが、オブジェクトの型を知る方法があると便利です。単体テストを検証するために、実際のクラスを取得する必要がある場合があります。考えられるすべてのオブジェクトは同じ API を持っていますが、正しいのは 1 つだけであるため、ダックタイピングが邪魔になります。また、ときどき他の人のコードを保守していて、渡されたオブジェクトの種類がわかりません。これは、Python のような動的型付け言語に関する私の最大の問題です。バージョン 1 は非常に簡単に開発できます。バージョン 2 は、特にバージョン 1 を作成していない場合は厄介です。そのため、作成していない関数を使用しているときに、パラメーターの型を知る必要がある場合があります。

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

于 2013-02-01T05:07:22.957 に答える
1

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

#!/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
于 2016-05-05T07:25:19.473 に答える