__init__ method for containers
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
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
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
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
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
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
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