On Fri, Apr 10, 2009 at 12:34 PM, C or L Smith <smi...@worksmail.net> wrote: > Unum is a module that allows one to handle units with numbers, e.g. 3*M -> 3 > [m], a measurement of 3 meters. > > I have a module that I wrote some time ago that handles uncertainties with > numbers as they are involved with calculations. Let's call it the pnum module > (for physical numbers) e.g. pnum(3,.1) specifies a value of 3 +/- 0.1. > > I worked with someone at that time of writing it who said..."it would be nice > to get this working with Unum." Well...it's that time, perhaps, but I could > use some help in knowing what's the best way to go. > > (Q1) My basic question is how to have these two work together. If they are to > be two separate entities, my routines need to check whether they are dealing > with a unum or not before doing certain operations. e.g. my routines define > "x" and "u" attributes for the numbers, but if the pnum gets wrapped up with > a unum then asking for x and u no longer works. I have to extract the pnum > part from the pnum/unum composite before asking for x and u.
I think I would try wrapping unums with pnums rather than the other way around, so you could have pnum(3, .1) or pnum(3*M, .1*M) and you probably want to allow pnum(3*M, .1) where the units are implied on the uncertainty. > But...does that mean I have to be unum aware in the pnum module? i.e. I have > to import unum (actually Unum from unum) so I can figure out what I am > dealing with in the routines that I have defined, Yes > e.g. > > def __mul__(self, other): > if isinstance(other,Unum): > return other*self > else: > return pnum(self.x*other.x,math.hypot(other.u*self.x,other.x*self.u),1) I don't think you would need the test for Unum, assuming math.hypot() works with unums. > def cos(x): > if isinstance(x,pnum): > return x.cos() > elif isinstance(x,Unum): > arg = x.asNumber(1) > if isinstance(arg,pnum):#it's a pnum unum > return pnum(arg[0],arg[1],1).cos() > else:#it's a pure unum > return math.cos(arg) > return math.cos(x) Here you might need some special code but not quite like this. > (Q2) If someone doesn't have unum installed, they should still be able to run > pnum...but now it has tests for unums sprinkled all throughout it. Do I now > have to put the tests for unums inside a try/except sort of structure to > allow pnum to run if unum isn't present? You can probably do something like this, to import the actual Unum class if it is present, otherwise define a dummy class: try: from unum import Unum except: class Unum(object): pass Then any tests for isinstance(x, Unum) will fail so the code inside the if block doesn't have to work without unum. Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor