基本上我想这样做:
obj = 'str'
type ( obj ) == string
我试过了:
type ( obj ) == type ( string )
它不起作用。
另外,其他类型呢?例如,我无法复制NoneType
。
答案 0 :(得分:208)
isinstance()
在您的情况下,isinstance("this is a string", str)
将返回True
。
您可能还想阅读此内容:http://www.canonical.org/~kragen/isinstance/
答案 1 :(得分:35)
isinstance
有效:
if isinstance(obj, MyClass): do_foo(obj)
但是,请记住:如果它看起来像一只鸭子,如果它听起来像一只鸭子,它就是一只鸭子。
编辑:对于无类型,您只需执行以下操作:
if obj is None: obj = MyClass()
答案 2 :(得分:31)
首先,避免所有类型比较。他们非常非常需要。有时,它们有助于检查函数中的参数类型 - 即使这种情况很少见。错误的类型数据会引发异常,这就是您所需要的全部内容。
所有基本转换函数都将映射为类型函数。
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 )
没有,BTW,从不需要任何这种类型检查。 None是NoneType的唯一实例。 None对象是Singleton。只需检查无
variable is None
BTW,一般不要使用上述内容。使用普通异常和Python自己的自然多态。
答案 3 :(得分:23)
对于其他类型,请查看types模块:
>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True
P.S。 Typechecking是一个坏主意。
答案 4 :(得分:13)
您始终可以使用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。但如果你只想记住一件事,你就能记住这一点。
在这种情况下,更好的方法是:
# 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
的一个实例,即None
。你会在异常中看到很多类型的无类型(TypeError: 'NoneType' object is unsubscriptable
- 一直发生在我身上......)但你几乎不需要在代码中引用它。
最后,正如fengshaun所指出的,在python中进行类型检查并不总是一个好主意。使用该值就好像它是您期望的类型,捕获(或允许传播)由它产生的异常更加pythonic。
答案 5 :(得分:6)
你非常接近! string
是一个模块,而不是一个类型。您可能希望将obj
的类型与字符串的类型对象进行比较,即str
:
type(obj) == str # this works because str is already a type
可替换地:
type(obj) == type('')
注意,在Python 2中,如果obj
是unicode类型,则上述两种方法都不起作用。 isinstance()
也不会。请参阅约翰对这篇文章的评论,了解如何解决这个问题...我一直试图记住它大约10分钟,但是有一个记忆块!
答案 6 :(得分:5)
这是因为你必须写
s="hello"
type(s) == type("")
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]
在这种情况下,您的代码将在运行system()调用之前引发异常。如果没有接口检查,您将删除该文件,然后引发异常。
答案 7 :(得分:3)
我使用type(x) == type(y)
例如,如果我想检查一下是一个数组:
type( x ) == type( [] )
字符串检查:
type( x ) == type( '' ) or type( x ) == type( u'' )
如果要检查无,请使用
x is None
答案 8 :(得分:3)
使用str而不是string
type ( obj ) == str
解释
>>> a = "Hello"
>>> type(a)==str
True
>>> type(a)
<type 'str'>
>>>
答案 9 :(得分:2)
我认为应该这样做
if isinstance(obj, str)
答案 10 :(得分:1)
类型不适用于某些类。如果您不确定对象的类型,请使用__class__
方法,如下所示:
>>>obj = 'a string'
>>>obj.__class__ == str
True
答案 11 :(得分:1)
要获取该类型,请使用__class__
成员,如unknown_thing.__class__
谈论鸭子打字在这里没用,因为它没有回答一个非常好的问题。在我的应用程序代码中,我永远不需要知道某些东西的类型,但是有一种学习对象类型的方法仍然很有用。有时我需要获得实际的类来验证单元测试。鸭子打字会妨碍那里,因为所有可能的对象都有相同的API,但只有一个是正确的。此外,有时我会维护别人的代码,我不知道我已经通过了什么样的对象。这是我在Python等动态类型语言中遇到的最大问题。版本1非常容易且快速开发。版本2是包子中的一个痛点,特别是如果你没有编写版本1.所以有时候,当我使用一个我没写的函数时,我需要知道一个参数的类型,所以我知道我可以用什么方法来调用它。
这就是__class__
参数派上用场的地方。那(据我所知)是获得对象类型的最佳方式(也许是唯一的方法)。
答案 12 :(得分:1)
使用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
因此,我建议使用要检查的对象类型(例如y
)实例化变量(在这种情况下为type(np.array())
),然后使用isinstance
。
答案 13 :(得分: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