type(None)()

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Aug 16 09:58:16 EDT 2012


On Thu, 16 Aug 2012 14:47:47 +0200, Hans Mulder wrote:

> On 8/08/12 04:14:01, Steven D'Aprano wrote:
>> NoneType raises an error if you try to create a second instance. bool
>> just returns one of the two singletons (doubletons?) again.
>>
>> py> type(None)()
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: cannot create 'NoneType' instances
> 
> Why is that?
> 
> Why doesn't it just return an existing instance of the type, like bool,
> int, str and other built-in non-mutable types do?

bool must return an instance, because it is designed to cast objects to a 
boolean. Since (by design) True and False are singletons (doubletons?), 
bool(x) will always return a pre-existing instance.

Other built-in immutable types do not promise to do that. For example:

py> a = float(42)
py> b = float(42)
py> a is b
False

Sometimes int and str will cache their instances, but this is an 
implementation detail subject to change without notice from version to 
version.

None, NotImplemented and Ellipsis are singletons, but unlikely bool, 
there is no common use-case for having their types return the singleton 
instance. The standard design pattern for singletons is to raise an 
exception if you try to create an instance, so they do. However, this 
behaviour really only makes sense for singletons that hold state. (If 
they hold state, you might be tempted to change that state, not realising 
that you are changing a singleton and not a second instance.)

In my opinion, this is a PITA for None and better behaviour would be to 
return the pre-existing NoneType instance, but I didn't design the 
language.


-- 
Steven



More information about the Python-list mailing list