Puzzled by list-appending behavior
Terry Reedy
tjreedy at udel.edu
Thu May 26 17:36:22 EDT 2011
On 5/26/2011 11:58 AM, MRAB wrote:
> On 26/05/2011 06:17, Chris Rebert wrote:
>> list.remove(), list.sort(), and list.extend() similarly return None
>> rather than the now-modified list.
> I'd just like to point out that it's a convention, not a rigid rule.
> Sometimes it's not followed, for example, dict.setdefault.
The rule for builtin collections is that mutation methods do not return
the collection. If there is a member of the collection to return, they
return that. Otherwise they return None.
list/set.pop and dict.popitem are other mutation methods that have a
(former) member to return.
The rule applies to special methods like __getitem__ (returns an item)
and __setitem__ (returns None). Since a.append(item) is *conceptually*
equivalent to a.__setitem(len(a), item) (I know, it raises) and
*actually* defined as a.__setitem(len(a):len(a), item), it should not be
surprising that all three return None.
I think the above should be better documented.
http://bugs.python.org/issue12192
has some proposals. Comments there welcome.
In another post
On 5/26/2011 4:09 AM, Chris Rebert wrote:
> I'm just surprised that the docstring doesn't explicitly state
> "Returns None." by this point, given that this is such a common point
> of newbie confusion.
I never noticed. After reading the above, I added this to the proposal
above.
--
Terry Jan Reedy
More information about the Python-list
mailing list