基本上我想这样做:
obj = 'str'
type ( obj ) == string
我试着:
type ( obj ) == type ( string )
但这并没有起作用。
还有,其他类型的呢?例如,我无法复制NoneType。
基本上我想这样做:
obj = 'str'
type ( obj ) == string
我试着:
type ( obj ) == type ( string )
但这并没有起作用。
还有,其他类型的呢?例如,我无法复制NoneType。
当前回答
因为你必须写作
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()调用之前引发异常。如果没有接口检查,您将删除该文件,然后引发异常。
其他回答
我用type(x) == type(y)
例如,如果我想检查一个数组:
type( x ) == type( [] )
字符串检查:
type( x ) == type( '' ) or type( x ) == type( u'' )
如果您想检查None,请使用is
x is None
isinstance工作原理:
if isinstance(obj, MyClass): do_foo(obj)
但是,请记住:如果它看起来像鸭子,如果它听起来像鸭子,它就是鸭子。
编辑:对于None类型,你可以简单地做:
if obj is None: obj = MyClass()
因为你必须写作
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()调用之前引发异常。如果没有接口检查,您将删除该文件,然后引发异常。
对于其他类型,请查看types模块:
>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True
注:类型检查是个坏主意。
使用isinstance(object, 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。