__init__ method for containers

2007-12-12 Thread Neil Cerutti
List and deque disagree on what __init__ does. Which one is
right?

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type help, copyright, credits or license for more information.
 from collections import deque
 x = deque([0, 1])
 x.__init__([2, 3])
 x
deque([0, 1, 2, 3])
 y = list([0, 1])
 y.__init__([2, 3])
 y
[2, 3]

test_deque.py even contains a test verifying its __init__
behavior, so perhaps deque has a good reason to differ from the
behavior of list.

Moreover, both methods use the same doc string, i.e.:

  __init__(...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

When implementing a list-like container extension type, is there
any reason to choose anything other than list-like behavior,
i.e., if you call __init__, you'll initialize the container?
deque's behavior doesn't make sense to me.

-- 
Neil Cerutti
One of the causes of the American Revolution was the English put tacks in
their tea. --History Exam Blooper
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Calvin Spealman
I agree that the behavior should be more consistant, but you also  
should not be calling __init__ more than once on any given instance  
and that in and of itself should probably constitute undefined behavior.

On Dec 12, 2007, at 3:22 PM, Neil Cerutti wrote:

 List and deque disagree on what __init__ does. Which one is
 right?

 Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit  
 (Intel)] on
 win32
 Type help, copyright, credits or license for more information.
 from collections import deque
 x = deque([0, 1])
 x.__init__([2, 3])
 x
 deque([0, 1, 2, 3])
 y = list([0, 1])
 y.__init__([2, 3])
 y
 [2, 3]

 test_deque.py even contains a test verifying its __init__
 behavior, so perhaps deque has a good reason to differ from the
 behavior of list.

 Moreover, both methods use the same doc string, i.e.:

   __init__(...)
 x.__init__(...) initializes x; see x.__class__.__doc__ for  
 signature

 When implementing a list-like container extension type, is there
 any reason to choose anything other than list-like behavior,
 i.e., if you call __init__, you'll initialize the container?
 deque's behavior doesn't make sense to me.

 -- 
 Neil Cerutti
 One of the causes of the American Revolution was the English put  
 tacks in
 their tea. --History Exam Blooper
 -- 
 http://mail.python.org/mailman/listinfo/python-list

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Neil Cerutti
On 2007-12-12, Calvin Spealman [EMAIL PROTECTED] wrote:
 I agree that the behavior should be more consistant, but you
 also  should not be calling __init__ more than once on any
 given instance  and that in and of itself should probably
 constitute undefined behavior.

That seems wise to me, too, but the the explicit __init__ test in
test_deque seems to argue otherwise. Maybe the test in error.

Moreover, the behavior of deque.__init__ may actually contradict
its doc string.

 help(deque.__init__)
Help on wrapper_descriptor:

__init__(...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

-- 
Neil Cerutti
A song fest was hell at the Methodist church Wednesday. --Church Bulletin
Blooper
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Raymond Hettinger
On Dec 12, 7:22 am, Neil Cerutti [EMAIL PROTECTED] wrote:
 List and deque disagree on what __init__ does. Which one is
 right?

File a bug report and assign to me.


Raymond
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Calvin Spealman
On Dec 12, 2007, at 4:05 PM, Neil Cerutti wrote:

 On 2007-12-12, Calvin Spealman [EMAIL PROTECTED] wrote:
 I agree that the behavior should be more consistant, but you
 also  should not be calling __init__ more than once on any
 given instance  and that in and of itself should probably
 constitute undefined behavior.

 That seems wise to me, too, but the the explicit __init__ test in
 test_deque seems to argue otherwise. Maybe the test in error.

 Moreover, the behavior of deque.__init__ may actually contradict
 its doc string.

It documents that deque.__init__ initializes it, as all __init__  
methods do. All init methods are also assumed to _only_ be called at  
the start of the life of the object and never more than once, so  
breaking that breaks assumption and thus the documentation isn't  
wrong because you are trying to apply it to a state that shouldn't  
exist. This like saying saying claims of cigarettes causing cancer  
are false if you shoot someone before they get the cancer. Well, you  
aren't supposed to shoot people, so that doesn't count.

 help(deque.__init__)
 Help on wrapper_descriptor:

 __init__(...)
 x.__init__(...) initializes x; see x.__class__.__doc__ for  
 signature

 -- 
 Neil Cerutti
 A song fest was hell at the Methodist church Wednesday. --Church  
 Bulletin
 Blooper
 -- 
 http://mail.python.org/mailman/listinfo/python-list

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Raymond Hettinger
On Dec 12, 8:41 am, Calvin Spealman [EMAIL PROTECTED]
wrote:
 It documents that deque.__init__ initializes it, as all __init__
 methods do. All init methods are also assumed to _only_ be called at
 the start of the life of the object and never more than once, so
 breaking that breaks assumption and thus the documentation isn't
 wrong because you are trying to apply it to a state that shouldn't
 exist.

That's overstating the case somewhat.  The init methods are
*typically* called only once but they are not *assumed* to be called
only once. They are in-fact just like any other method except that
their first invocation is automatic.  The clear and re-initialize
behavior of __init__ for lists is evidence.  If list.__init__ was
assumed to be called only once, there would be no need for the step
that clears-out previous values.

Also, it is not obvious what the right behavior is.  While
list.__init__ clears previous values, dict.__init__ does not.

In the case of deque.__init__, the lack of clearing behavior is a bug
because the API aspires to mimic lists as much as possible.


Raymond
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: __init__ method for containers

2007-12-12 Thread Neil Cerutti
On 2007-12-12, Raymond Hettinger [EMAIL PROTECTED] wrote:
 On Dec 12, 7:22 am, Neil Cerutti [EMAIL PROTECTED] wrote:
 List and deque disagree on what __init__ does. Which one is
 right?

 File a bug report and assign to me.

Will do. Registration in progress.

-- 
Neil Cerutti
-- 
http://mail.python.org/mailman/listinfo/python-list