2012-11-05 66 views
2

我知道不建议比较类型,但我有一些代码在if elif系列中执行此操作。然而,我很困惑None值如何工作。与无变量类型的比较

def foo(object) 
    otype = type(object) 
    #if otype is None: # this doesn't work 
    if object is None: # this works fine 
     print("yep") 
    elif otype is int: 
    elif ... 

为什么我可以比较只是is int罚款等,但不与is None? types.NoneType似乎在Python 3.2消失,所以我不能使用...

以下

i = 1 
print(i) 
print(type(i)) 
print(i is None) 
print(type(i) is int) 

打印

1 
<class 'int'> 
False 
True 

i = None 
print(i) 
print(type(i)) 
print(i is None) 
print(type(i) is None) 

印花

None 
<class 'NoneType'> 
True 
False 

我猜None是特别的,但是什么给了? NoneType确实存在,还是Python对我说谎?

回答

5

None是Python提供的特例单例。 NoneType是单例对象的类型。 type(i) is NoneFalse,但type(i) is type(None)应该是true。

6

您应该永远不需要与NoneType进行比较,因为None是单身人士。如果您有一些对象obj可能是None,只是obj is Noneobj is not None

您的比较不起作用的原因是None不是一个类型,它是一个值。它类似于在整数示例中尝试type(1) is 1。如果你真的想做一个NoneType检查,你可以使用type(obj) is type(None),或更好的isinstance(obj, type(None))

+0

非常真实和重要,但问题的其他部分也值得回答。 – delnan

+0

这使得在任何类型检查代码中检查'None'-ness是一个特例。有时,检查'NoneType'比检查'x是None或isinstance(x,(footype,bartype))'更清晰。 –

+4

对象标识实际上是检查类型的正确的事情:'type(obj)是SomeType'是我推荐用于检查*确切*类型匹配(非常罕见的要求)。在常见情况下,使用'isinstance()'。 –