Go Back   Rhinocerus > Newsgroup > Newsgroup comp.lang.python

Reply
 
Thread Tools Display Modes
  #1 (permalink)  
Old 08-16-2012, 12:47 PM
Hans Mulder
Guest
 
Posts: n/a
Default type(None)()

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

Reply With Quote
Alt Today
Advertising
 
and become member of Rhinocerus
Standard Sponsored Links

  #2 (permalink)  
Old 08-16-2012, 12:54 PM
Laszlo Nagy
Guest
 
Posts: n/a
Default Re: type(None)()

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()


Reply With Quote
  #3 (permalink)  
Old 08-16-2012, 01:37 PM
Chris Angelico
Guest
 
Posts: n/a
Default Re: type(None)()

On Thu, Aug 16, 2012 at 10:47 PM, Hans Mulder <hansmu@xs4all.nl> 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
Reply With Quote
  #4 (permalink)  
Old 08-16-2012, 01:56 PM
Ian Kelly
Guest
 
Posts: n/a
Default Re: type(None)()

On Thu, Aug 16, 2012 at 6:47 AM, Hans Mulder <hansmu@xs4all.nl> 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.
Reply With Quote
  #5 (permalink)  
Old 08-16-2012, 01:58 PM
Steven D'Aprano
Guest
 
Posts: n/a
Default Re: type(None)()

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
Reply With Quote
  #6 (permalink)  
Old 08-16-2012, 02:56 PM
Robert Kern
Guest
 
Posts: n/a
Default Re: type(None)()

On 8/16/12 2:56 PM, Ian Kelly wrote:
> On Thu, Aug 16, 2012 at 6:47 AM, Hans Mulder <hansmu@xs4all.nl> 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

Reply With Quote
  #7 (permalink)  
Old 08-16-2012, 03:13 PM
MRAB
Guest
 
Posts: n/a
Default Re: type(None)()

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 <hansmu@xs4all.nl> 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[i] += 1

Of course, an alternative would be:

counts = defaultdict(lambda: 0)

Reply With Quote
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off




All times are GMT. The time now is 02:19 PM.


Copyright ©2009

LinkBacks Enabled by vBSEO 3.3.0 RC2 © 2009, Crawlability, Inc.