Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

comparison with type of None variables

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?

like image 902
user673679 Avatar asked Dec 07 '22 11:12

user673679


2 Answers

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.

like image 193
Silas Ray Avatar answered Dec 14 '22 08:12

Silas Ray


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

like image 24
Andrew Clark Avatar answered Dec 14 '22 09:12

Andrew Clark