type(None)()

Discussion in 'Python' started by Hans Mulder, Aug 16, 2012.

  1. Hans Mulder

    Hans Mulder Guest

    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?

    > py> type(False)() is False
    > True



    Just wondering,

    -- HansM
     
    Hans Mulder, Aug 16, 2012
    #1
    1. Advertising

  2. Hans Mulder

    Laszlo Nagy Guest

    On 2012-08-16 14:47, 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?

    Because None is a singleton. It is the only instance of its class. This
    is very useful because it allows you to write conditions like this:

    if obj is None:
    do_something()
     
    Laszlo Nagy, Aug 16, 2012
    #2
    1. Advertising

  3. On Thu, Aug 16, 2012 at 10:47 PM, Hans Mulder <> wrote:
    > Why doesn't it just return an existing instance of the type,
    > like bool, int, str and other built-in non-mutable types do?
    >
    >> py> type(False)() is False
    >> True


    With int and str, it's only an optimization, and not guaranteed to happen.

    >>> a=int("1234")
    >>> a is int("1234")

    False

    >>> a=str(1234)
    >>> a is str(1234)

    False

    But with bool, it's required, as a means of "casting to boolean". With
    True/False/None, it's normal to compare them with is:

    >>> a=bool("1")
    >>> a is bool("2")

    True

    So bool() has to return one of those two actual objects, and not an equivalent.

    (Note: All examples done in CPython 3.2's IDLE on Windows. Other
    environments, Pythons, versions, etc, may affect exactly what these
    show.)

    ChrisA
     
    Chris Angelico, Aug 16, 2012
    #3
  4. Hans Mulder

    Ian Kelly Guest

    On Thu, Aug 16, 2012 at 6:47 AM, 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?


    Because unlike those other types there is no use case for that. It's
    simpler to raise an error.
     
    Ian Kelly, Aug 16, 2012
    #4
  5. 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
     
    Steven D'Aprano, Aug 16, 2012
    #5
  6. Hans Mulder

    Robert Kern Guest

    On 8/16/12 2:56 PM, Ian Kelly wrote:
    > On Thu, Aug 16, 2012 at 6:47 AM, 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?

    >
    > Because unlike those other types there is no use case for that. It's
    > simpler to raise an error.


    What are the use cases for the empty-argument versions of bool(), int(),
    float(), and str()?

    --
    Robert Kern

    "I have come to believe that the whole world is an enigma, a harmless enigma
    that is made terrible by our own mad attempt to interpret it as though it had
    an underlying truth."
    -- Umberto Eco
     
    Robert Kern, Aug 16, 2012
    #6
  7. Hans Mulder

    MRAB Guest

    On 16/08/2012 15:56, Robert Kern wrote:
    > On 8/16/12 2:56 PM, Ian Kelly wrote:
    >> On Thu, Aug 16, 2012 at 6:47 AM, 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?

    >>
    >> Because unlike those other types there is no use case for that. It's
    >> simpler to raise an error.

    >
    > What are the use cases for the empty-argument versions of bool(), int(),
    > float(), and str()?
    >

    They can be used with defaultdict. For example:

    counts = defaultdict(int)
    for i in items:
    counts += 1

    Of course, an alternative would be:

    counts = defaultdict(lambda: 0)
     
    MRAB, Aug 16, 2012
    #7
  8. Steven D'Aprano, 16.08.2012 15:58:
    >>> NoneType raises an error if you try to create 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.


    The time machine strikes again.

    Python 3.3.0b1 (default:f7b59e890e30, Aug 11 2012, 05:30:10)
    [GCC 4.6.3] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> type(None)()
    >>> print(type(None)())

    None

    Stefan
     
    Stefan Behnel, Aug 16, 2012
    #8
  9. Ramchandra Apte, 16.08.2012 17:39:
    > On 16 August 2012 21:01, Stefan Behnel wrote:
    >> Steven D'Aprano, 16.08.2012 15:58:
    >>>>> NoneType raises an error if you try to create 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.

    >>
    >> The time machine strikes again.
    >>
    >> Python 3.3.0b1 (default:f7b59e890e30, Aug 11 2012, 05:30:10)
    >> [GCC 4.6.3] on linux
    >> Type "help", "copyright", "credits" or "license" for more information.
    >>>>> type(None)()
    >>>>> print(type(None)())

    >> None

    >
    > Are they the same object


    Obviously. None is a singleton (as was already mentioned a couple of times
    in this thread).

    Stefan
     
    Stefan Behnel, Aug 16, 2012
    #9
  10. Hans Mulder

    Ethan Furman Guest

    Ramchandra Apte wrote:
    > Are they the same object


    Yes.
     
    Ethan Furman, Aug 16, 2012
    #10
  11. Hans Mulder

    Ethan Furman Guest

    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?


    An oversight, and until a few months ago nobody had complained loud
    enough. ;)


    > Why doesn't it just return an existing instance of the type,
    > like bool, int, str and other built-in non-mutable types do?


    In 3.3 it now does.

    ~Ethan~
     
    Ethan Furman, Aug 16, 2012
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. David Freeman
    Replies:
    8
    Views:
    7,653
    tcena9
    Feb 16, 2011
  2. length power
    Replies:
    2
    Views:
    92
    Rustom Mody
    Apr 10, 2014
  3. Skip Montanaro
    Replies:
    0
    Views:
    64
    Skip Montanaro
    Apr 10, 2014
  4. Johannes Schneider

    Re: why i have the output of [None, None, None]

    Johannes Schneider, Apr 10, 2014, in forum: Python
    Replies:
    0
    Views:
    54
    Johannes Schneider
    Apr 10, 2014
  5. Terry Reedy
    Replies:
    0
    Views:
    64
    Terry Reedy
    Apr 10, 2014
Loading...

Share This Page