Using Decorators to wrap functions

from PhysicalQuantities.decorator import *

Require units in function call

@require_units('V', 'A')
def power(u, i):
    return (u*i).W
power(1,1)
---------------------------------------------------------------------------

UnitError                                 Traceback (most recent call last)

<ipython-input-3-bd6d8cb9b6d5> in <module>()
----> 1 power(1,1)


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in wrapper(wrapped, instance, args, kwargs)
     53     def wrapper(wrapped, instance, args, kwargs):
     54         for i, arg in enumerate(args):
---> 55             checkbaseunit(arg, units[i])
     56         for i, kwarg in enumerate(kwargs):
     57             checkbaseunit(kwarg, units[i])


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in checkbaseunit(arg, unit)
     12     """
     13     if not isinstance(arg, PhysicalQuantity):
---> 14         raise UnitError('%s is not a PhysicalQuantitiy' % arg)
     15     try:
     16         arg.unit.conversion_tuple_to(unit_table[unit])


UnitError: 1 is not a PhysicalQuantitiy
power(1V, 1A)
1.0 W
power(1A, 1A)
---------------------------------------------------------------------------

UnitError                                 Traceback (most recent call last)

/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in checkbaseunit(arg, unit)
     15     try:
---> 16         arg.unit.conversion_tuple_to(unit_table[unit])
     17         return True


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/Unit.py in conversion_tuple_to(self, other)
    336         if self.powers != other.powers:
--> 337             raise UnitError('Incompatible units')
    338


UnitError: Incompatible units


During handling of the above exception, another exception occurred:


UnitError                                 Traceback (most recent call last)

<ipython-input-5-5e21cfcad74a> in <module>()
----> 1 power(PhysicalQuantity(1,'A'), PhysicalQuantity(1,'A'))


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in wrapper(wrapped, instance, args, kwargs)
     53     def wrapper(wrapped, instance, args, kwargs):
     54         for i, arg in enumerate(args):
---> 55             checkbaseunit(arg, units[i])
     56         for i, kwarg in enumerate(kwargs):
     57             checkbaseunit(kwarg, units[i])


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in checkbaseunit(arg, unit)
     17         return True
     18     except UnitError:
---> 19         raise UnitError('%s is not of unit %s' % (arg, unit))
     20
     21


UnitError: 1 A is not of unit V
@require_units(u='V', i='A')
def powerkw(u=0V, i=0A):
    return (u*i).W
powerkw(u=1V, i=1A)
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-20-20a0a3217087> in <module>()
----> 1 powerkw(u=PhysicalQuantity(1,'V'), i=PhysicalQuantity(1,'A'))


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in wrapper(wrapped, instance, args, kwargs)
     55             checkbaseunit(arg, units[i])
     56         for i, kwarg in enumerate(kwargs):
---> 57             checkbaseunit(kwarg, units[i])
     58         ret = wrapped(*args, **kwargs)
     59         return ret


IndexError: tuple index out of range

Optional units in function call

@optional_units('V', 'A', return_unit='W')
def powero(u, i):
    return u*i
powero(1, 1)
1 W
powero(1V, 1A)
1.0 W
powero(1V, 1m)
---------------------------------------------------------------------------

UnitError                                 Traceback (most recent call last)

/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in dropunit(arg, unit)
     30     try:
---> 31         arg.unit.conversion_tuple_to(unit_table[unit])
     32         return arg.base.value


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/Unit.py in conversion_tuple_to(self, other)
    336         if self.powers != other.powers:
--> 337             raise UnitError('Incompatible units')
    338


UnitError: Incompatible units


During handling of the above exception, another exception occurred:


UnitError                                 Traceback (most recent call last)

<ipython-input-11-4a19eba42854> in <module>()
----> 1 powero(PhysicalQuantity(1,'V'), PhysicalQuantity(1,'m'))


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in wrapper(wrapped, instance, args, kwargs)
     78         newargs = []
     79         for i, arg in enumerate(args):
---> 80             newargs.append(dropunit(arg, units[i]))
     81         newkwargs = {}
     82         for i, key in enumerate(kwargs):


/Users/juhasch/anaconda/lib/python3.4/site-packages/PhysicalQuantities-0.6.1-py3.4.egg/PhysicalQuantities/decorator.py in dropunit(arg, unit)
     32         return arg.base.value
     33     except UnitError:
---> 34         raise UnitError('%s is not of unit %s' % (arg, unit))
     35
     36


UnitError: 1 m is not of unit A
@optional_units(u='V', i='A')
def powerokw(u=0, i=0):
    return (u*i).W
def a(u=1):
    return b