I know that comparison of types is not recommended, but I have some code that does this in an if elif series. However, I am confused as to how None values work.

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 ...

How come I can compare just fine with is int and so forth, but not with is None? types.NoneType seems to be gone in Python 3.2, so I can't use that...

The following

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

prints

1
<class 'int'>
False
True

whereas

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

prints

None
<class 'NoneType'>
True
False

I guess None is special, but what gives? Does NoneType actually exist, or is Python lying to me?

有帮助吗?

解决方案

None is a special-case singleton provided by Python. NoneType is the type of the singleton object. type(i) is None is False, but type(i) is type(None) should be true.

其他提示

You should never need to compare to NoneType, because None is a singleton. If you have some object obj that might be None, just is obj is None or obj is not None.

The reason your comparison does not work is that None is not a type, it is a value. It would similar to trying type(1) is 1 in your integer example. If you really wanted to do a NoneType check, you could use type(obj) is type(None), or better yet isinstance(obj, type(None)).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top