sequence multiplied by -1

Seebs usenet-nospam at seebs.net
Sun Sep 26 05:30:08 EDT 2010


On 2010-09-26, Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au> wrote:
> On Sat, 25 Sep 2010 23:46:57 -0700, Paul Rubin wrote:
>> I think the idea is you should not be able to do mathematical operations
>> on strings, and if you try to do one, Python should raise an exception,
>> rather than using hokey analogies to guess at what you were trying to
>> do.  If you want to replicate a sequence, introduce a function with a
>> name like "replicate", rather than overloading an arithmetic operator.

> But * isn't a mathematical operation on sequences. It's a repetition 
> operator.

I think Paul's point is that "*" is in general a mathematical operation,
and discovering that for some types of objects, it's been given a
fundamentally unrelated meaning can certainly be a bit of a surprise.

I actually sort of like that perl has a separate repetition operator.
And really, when you find yourself saying something nice about perl's
syntax or punctuation, that's always scary territory to be in.

> There's nothing obscure or unintuitive about "spam"*3 = "spamspamspam", 
> and the fact that it doesn't do the same thing as int("spam")*3 is a 
> foolish argument.

The languages in which it's surprising are mostly things like perl, where
there's a certain amount of implicit coercion going on, so it's ambiguous
whether "3"*3 ought to mean "333" or 9.  (Except it isn't, because repetition
is a separate operator, written "3" x 3 rather than "3" * 3...)  People
coming from that kind of background may be expecting * to stay an
arithmetic operator, rather than having it change form when applied to
non-arithmetic objects.

I'm not sure either way.  I think on the whole, I like the notion of
a repetition operator which is distinct from multiplication, but I also
definitely prefer the lack of implicit coercion, and without implicit
coercion, there's a lot less underlying ambiguity to worry about.

>From the top, I guess my analysis is:

* It seems clear that, given two sequences x and y, "x + y" ought to
  be the concatenation of these sequences.
* Thus, "x + x" should be x concatenated to itself.
* Idiomatically, it is not unreasonable to assert that "x * 2" and "x + x"
  could be the same value.
* It thus makes some sense for <sequence> * <number> to indicate
  repetition of the sequence.
* Since a string is a kind of a sequence, it also makes sense for
  <string> * <number> to indicate repetition.

So I think I'm pretty much convinced that Python's behavior makes sense,
but it makes sense only because I'm going into this expecting operators
to be defined by types, so I don't expect every '*' to mean 'multiplication'.

Helps, perhaps, that I got exposed to group theory early enough to be used
to redefining + and * to be any two operations which have interesting
properties*.

-s
[*] What's purple and commutes?  An abelian grape.
-- 
Copyright 2010, all wrongs reversed.  Peter Seebach / usenet-nospam at seebs.net
http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures
http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated!
I am not speaking for my employer, although they do rent some of my opinions.



More information about the Python-list mailing list