Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top