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