Generic singleton
Steve Howell
showell30 at yahoo.com
Thu Mar 4 23:14:42 EST 2010
On Mar 4, 7:32 pm, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
>
> Python does have it's own singletons, like None, True and False. For some
> reason, they behave quite differently: NoneType fails if you try to
> instantiate it again, while bool returns the appropriate existing
> singleton:
>
> >>> NoneType = type(None)
> >>> NoneType()
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: cannot create 'NoneType' instances>>> bool(45)
>
> True
>
> I wonder why NoneType doesn't just return None?
>
It's an interesting question. Just to elaborate on your example:
>>> type(None)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'NoneType' instances
>>> type(True)(False)
False
>>> type(False)(True)
True
I suspect that the answer is just that None is special. There is
probably just no compelling use case where you want to clone None in a
one-liner.
To make None work like True/False in certain use cases you'd want
something like this:
def clone(val):
if val is None:
return None
else:
return type(val)(val)
The same method would work against some non-singletons as well,
although I'm not sure what the desired semantics would actually be:
for value in [None, False, True, 42, [1, 2, 3]]:
print clone(value)
More information about the Python-list
mailing list