On Sunday, February 10, 2013 5:29:54 AM UTC-6, Steven D'Aprano wrote:
> Rick wrote:
> And you have missed my point, which is that reversed(), and sorted(), were
> not added to the language on a whim, but because they were requested, over
> and over and over again.

Well, well, this explains everything!

We don't add features because of logic, or because of consistency, or even 
because of good sense, we simply add them to appease the masses.

psst: Steven, maybe if the C and Java heads moan long enough we can get braced 
scoping, or, if the ruby guys pester us enough we can adopt the dollar sign to 
denote globals, the "@@" for class variables, and the "@" for instance 
variables! Oh yes! Because being loved is SO much more important than sticking 
to our philosophy of the Python Zen.

> "appended" is called list addition.
>
> newlist = oldlist + [item_to_append]

But where is the consistency?

Yes the syntactic sugar of the "plus sign" is concise, however, the "+" 
operator does not "pair" intuitively with the "append" method. Even IF you 
transformed the "+" operator into a named method like "add" (or call the magic 
method "__add__") it still fails to mesh properly with "append", and the two 
words utterly fail to intuitively establish an "in-place" versus "copy-mutate" 
relationship. Consider the English definitions of "add" and "append" when 
applied to sequence objects:

  DEFINE "add"
    Expand a sequence of "somethings" to include
    additional "somethings" -- which may be another
    sequence of N somethings. However the exact
    location of the new "somethings" is not clearly
    intuit-able from the word "add" alone!

  DEFINE "append"
    Expand a sequence of "somethings" to include an
    additional "something". Here the exact location
    is can be intuited as: "at the end".

> >  flatten, flattened
> 
> flatten is another often requested, hard to implement correctly, function.
> The only reason that Python doesn't have a flatten is that nobody can agree
> on precisely what it should do.

Steven, the definition of flatten (as relates to sequences) is very, VERY 
simple:

    Return a new sequence that is the result of reducing
    a nested sequence of sequences into a single depth 
    sequence.

> Like map, filter, reduce, etc. flatten is not sensibly implemented as a
> mutator method, but as a function.

Only because you, along with a few other high ranking members of this community 
(including the BDFL himself!) have this /aversion/ to true OOP paradigm. 

Can you provide an example of how flatten "as a method" is incorrect versus 
flatten "as a function" is correct, or will this challenge be silently swept 
under the rug as so many before?

> >  insert, inserted
> 
> "inserted" is called addition, together with list slicing when needed.
> newlist = [item_to_insert] + oldlist
> newlist = oldlist[0:5] + [item_to_insert] + oldlist[5:


"inserted" is called "addition" by who?

If are implying that "seq.__add__()" employs the semantics of the English word 
"addition" and seq.insert(arg) is a thin wrapper around 
"oldlist[0:5]+[item]+oldlist[5:]", then fine. But how will someone intuit those 
two methods as have a "mutating pairs relationship" from the names alone? Not 
to mention that calling magic methods is anti-pythonic!

> >  map, mapped
> >  filter, filtered
> >  reduce, reduced
> 
> Those are nonsense. None of those are in-place mutator methods.

Well not in the current implementation of Python; but they could be if we 
wanted them to be. Applying mutations both "in-place" and "to a copy" are very 
helpful. For example, Ruby supplies both forms for many commonly used 
operations on arrays: (However i am not a fan of these "mutator pairs")

    slice, slice!
    sort, sort!
    flatten, flatten!
    collect, collect!
    map, map!
    uniq, uniq!
    reject, reject!
    reverse, reverse!
    compact, compact!


Steven, just because you have yet to encounter such usage does not mean the 
usage is "non-sense"

    seq.map(func)
    new = seq.mapped(func)

    seq.filter(lambda x: x<2)
    new = seq.filtered(lambda x: x<2)


> Especially reduce, which reduces a list to a single item. 

Nice to see you are paying attention! I am sure you already know this, although 
your wording was clumsy and suggests otherwise, but reduce does NOTHING to the 
list itself:

py> from operator import add
py> a = [1,2,3]
py> reduce(add, a)
6
py> a
[1, 2, 3]

reduce simply returns the result of the reduction; which is an Integer.

However it is my strong belief that the sum function should not exist when a 
reduce function does. Why? Because "sum([1,2,3])" is the equivalent of 
"reduce(operator.add, [1,2,3])"; the latter being significantly explicit and 
the former being a potential linguistical interpretation nightmare.

Now some might complain about this proposed removal of "sum" because the reduce 
function requires two arguments whereas the sum only needs one, and I say 
you're correct, however, this negative attribute is an artifact of a "global 
function nightmare architecture" and IF the core developers of Python would 
accept the fine principals of true OOP paradigm, then the call would look like 
this instead:

    seq.reduce(operator.add)

This fine example of OOP style is much easier to grok than the either the sum 
or reduce global functions could ever wish to be.

> >  extend, extended
> 
> Again, "extended" is spelled list addition.
> 
> Are you sure you've actually programmed in Python before? You seem awfully
> ignorant of language features.

So you are saying that "addition" is a "language feature"(sic). Can you please 
provide an example of "addition" as a language feature?

py> 'addition' in dir(list)
False

> [...]
> > My point was this: All mutate methods should mutate "in-place",
> 
> Well duh. All mutator methods do mutate in-place, otherwise they wouldn't be
> mutator methods.

So "reversed()" and "sorted()" mutate in-place? Do you realize that these two 
functions are an extension of the list (or sub-types of list) interface and are 
in fact mutating a seq object in-place! Maybe not the sequence object you 
called the function on, but a seq object none-the-less!

> > if the
> > programmer wishes to create a mutated copy of the object, then the
> > programmer should /explicitly/ create a copy of the object and then apply
> > the correct mutator method to the copy.
> 
> Been there, done that, it sucks. That's about a dozen steps backwards to a
> worse time in Python development.

Why? Because you have to type this

    reversed = list(seq).reverse()

Instead of this:

    reversed = reversed(seq)

*rolls-eyes*
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to