On Tue, Sep 21, 2010 at 7:44 PM, Michael Gilbert firstname.lastname@example.org wrote:
It would be really nice if elementary mathematical operations such as sin/cosine (via __sin__ and __cos__) were available as base parts of the python data model . This would make it easier to write new math classes, and it would eliminate the ugliness of things like self.exp().
This would also eliminate the need for separate math and cmath libraries since those could be built into the default float and complex types.
Hmm. Are you proposing adding 'sin', 'cos', etc. as new builtins? If so, I think this is a nonstarter: the number of Python builtins is deliberately kept quite small, and adding all these functions (we could argue about which ones, but it seems to me that you're talking about around 18 new builtins---e.g., 6 trig and inverse trig, 6 hyperbolic and inverse hyperbolic, exp, expm1, log, log10, log1p, sqrt) would enlarge it considerably. For many users, those functions would just be additional bloat in builtins, and there's possibility of confusion with existing variables with the same name ('log' seems like a particular candidate for this; 'sin' less likely, but who knows ;-).
A less invasive proposal would be just to introduce __sin__, etc. magic methods and have math.sin delegate to <type>.__sin__; i.e., have math.sin work in exactly the same way that math.floor and math.ceil currently work. That would be quite nice for e.g., the decimal module: you'd be able to write something like:
from math import sqrt root = (-b + sqrt(b*b - 4*a*c)) / (2*a)
to compute the root of a quadratic equation, and it would work regardless of whether a, b, c were Decimal instances or floats.
I'm not sure how I feel about the entailed magic method explosion, though.