基本上我想这样做:
obj = 'str'
type ( obj ) == string
我试过了:
type ( obj ) == type ( string )
而且没有用
另外,其他类型呢?例如,我无法复制NoneType
。
基本上我想这样做:
obj = 'str'
type ( obj ) == string
我试过了:
type ( obj ) == type ( string )
而且没有用
另外,其他类型呢?例如,我无法复制NoneType
。
Answers:
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”而不是“ Nope”。如何解决这个问题?
isinstance
也检查None
,然后isinstance(obj, (MyClass, type(None)))
作品。types.NoneType
已从Python 3中删除,因此它不像type(None)
引用那样可移植NoneType
。
首先,避免所有类型的比较。它们非常非常必要。有时,它们有助于检查函数中的参数类型-即使这种情况很少见。错误的类型数据将引发异常,这就是您所需要的。
所有基本转换函数都将映射为等于类型函数。
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对象是一个Singleton。只需检查无
variable is None
顺便说一句,一般不要使用以上内容。使用普通异常和Python自己的自然多态性。
NoneType
。如果一个参数可以是一个str
,unicode
或者None
?isinstance(x, (str, unicode, types.NoneType))
比检查是否干净得多None
。如果您要构建用于延迟计算的工具,或者要启动一个漫长的过程或占用大量资源的过程,那么type
在某些自定义验证步骤中提前发现错误是很有价值的。这一直是我从事过的几乎所有科学计算项目的关键部分。在我见过的所有开发项目中,有更多需要而不是没有。
您总是可以使用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
请注意最后一种情况:NoneType
python中只有一个实例,即None
。您会在异常中看到很多NoneType(TypeError: 'NoneType' object is unsubscriptable
-一直在我身上发生..),但是您几乎不需要在代码中引用它。
最后,正如fengshaun指出的那样,在python中进行类型检查并不总是一个好主意。只使用该值,就像它是您期望的类型一样,并捕获(或允许传播)由此产生的异常,这是更Python风格的。
你很亲密!string
是模块,而不是类型。您可能要比较obj
字符串的type对象和type对象的类型,即str
:
type(obj) == str # this works because str is already a type
或者:
type(obj) == type('')
请注意,在Python 2中,如果obj
是unicode类型,则以上两种都不起作用。也不会isinstance()
。有关此问题的解决方法,请参见John对这篇文章的评论。我一直在想起它大约10分钟,但是有一个内存块!
因为你必须写
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]
但是这样做没有任何意义:如果无论如何都不满足协议,则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()调用之前引发异常。如果不进行接口检查,则将删除该文件,然后引发异常。
我用 type(x) == type(y)
例如,如果我要检查的东西是一个数组:
type( x ) == type( [] )
字符串检查:
type( x ) == type( '' ) or type( x ) == type( u'' )
如果要检查无,请使用
x is None
类型不适用于某些类。如果不确定对象的类型,请使用__class__
方法,如下所示:
>>>obj = 'a string'
>>>obj.__class__ == str
True
另请参阅这篇文章-http: //www.siafoo.net/article/56
要获取类型,请使用__class__
成员,如下所示unknown_thing.__class__
在这里说鸭嘴式是没有用的,因为它不能回答一个完美的问题。在我的应用程序代码中,我永远不需要知道某种事物的类型,但是有一种学习对象类型的方法仍然很有用。有时我需要获得实际的课程来验证单元测试。因为所有可能的对象都具有相同的API,但只有一个是正确的,因此鸭子类型会妨碍您的输入。另外,有时我正在维护其他人的代码,而且我不知道我传递了什么样的对象。这是诸如Python之类的动态类型语言的最大问题。版本1非常易于开发。第2版让您不知所措,尤其是如果您没有编写第1版时。因此,有时候,当我使用未编写的函数时,我需要知道参数的类型,
那就是__class__
参数派上用场的地方。(据我所知)这是获取对象类型的最佳方法(也许是唯一方法)。
使用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
。
您可以比较检查级别的类。
#!/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
type(obj) == str