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)).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With