The python language reference mentions three objects which have a single, unique instance: None
, NotImplemented
, and Ellipsis
(section 3.2 "The Standard Type Hierarchy"). The test x is None
is a common idiom made possible by the guaranteed uniqueness of None
. I cannot find any other mention of unique-instance objects, either in python documentation or on stack overflow. A few questions, like this one have interesting suggestions for ways to construct such objects, but what I want to know is whether there are any beyond these three built-ins that I've missed.
For example, ()
appears to be unique (in admittedly very limited testing in CPython), so is the test x is ()
safe? Or is x == ()
mandatory for this case?
Well... you can think of any global object as being "unique" in the sense that it is always the same object.
For example:
>>> x = file
>>> x is file
True
>>> x = True
>>> x is True
True
>>> x = ZeroDivisionError
>>> x is ZeroDivisionError
True
There is nothing special about:
>>> x = None
>>> x is None
True
What you are probably wondering is why you should test x is None
rather than x == None
.
The answer is: x == None
will call x.__eq__(None)
which may return True
in all sorts of situations where x
is not actually None
(although in reality that is not very common).
Instance?
Well, you may say there is a difference: None
is an instance.
Well, the truth is, everything in Python is an object, which means everything is an instance. In my examples, file
and ZeroDivisionError
are instances of type
, True
is instance of bool
and None
is instance of NoneType
(note that type
is an instance of type
, so there are no exceptions to the rule).
There is one special thing about None
- it is the only instance of NoneType
and you cannot make others (unless there is some good trick?)
But that is actually a property of NoneType
- it does not let you make new instances:
TypeError: cannot create 'NoneType' instances
But that is not really essential for the whole story.
EDIT These "unique-instance objects" are called singletons. You can make some of yours, of course.
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