基本上我想这样做:
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(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
顺便说一句,一般不要使用上述内容.使用普通异常和Python自己的自然多态.
对于其他类型,请查看类型模块:
>>> import types >>> x = "mystring" >>> isinstance(x, types.StringType) True >>> x = 5 >>> isinstance(x, types.IntType) True >>> x = None >>> isinstance(x, types.NoneType) True
PS Typechecking是一个坏主意.
你可以随时使用这个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中进行类型检查并不总是一个好主意.使用该值就好像它是您期望的类型,捕获(或允许传播)由它产生的异常更加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接受一个实例并返回其类型.在这种情况下,您必须比较两个实例的类型.
如果需要进行抢占式检查,最好检查支持的接口而不是类型.
除了你的代码想要一个特定类型的实例这个事实之外,这个类型并没有真正告诉你多少,不管你是否可以拥有一个完全不同类型的另一个实例,因为它实现了相同的接口.
例如,假设您有此代码
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()调用之前引发异常.如果没有接口检查,您将删除该文件,然后引发异常.