pypet/brian2/parameter.py
def unit_from_expression(expr):
    """Takes a unit string like ``'1. * volt'`` and returns the BRIAN2 unit."""
    if expr == '1':
        return get_unit_fast(1)
    elif isinstance(expr, str):
        mod = ast.parse(expr, mode='eval')
        expr = mod.body
        return unit_from_expression(expr)
    elif expr.__class__ is ast.Name:
        return ALLUNITS[expr.id]
    elif expr.__class__ is ast.Num:
        return expr.n
    elif expr.__class__ is ast.UnaryOp:
        op = expr.op.__class__.__name__
        operand = unit_from_expression(expr.operand)
        if op=='USub':
            return -operand
        else:
            raise SyntaxError("Unsupported operation "+op)
    elif expr.__class__ is ast.BinOp:
        op = expr.op.__class__.__name__
        left = unit_from_expression(expr.left)
        right = unit_from_expression(expr.right)
        if op=='Add':
            u = left+right
        elif op=='Sub':
            u = left-right
        elif op=='Mult':
            u = left*right
        elif op=='Div':
            u = left/right
        elif op=='Pow':
            n = unit_from_expression(expr.right)
            u = left**n
        elif op=='Mod':
            u = left % right
        else:
            raise SyntaxError("Unsupported operation "+op)
        return u
    else:
        raise RuntimeError('You shall not pass')
def unit_from_expression(expr):
    """Takes a unit string like ``'1. * volt'`` and returns the BRIAN2 unit."""
    if expr == '1':
        return get_unit_fast(1)
    elif isinstance(expr, str):
        mod = ast.parse(expr, mode='eval')
        expr = mod.body
        return unit_from_expression(expr)
    elif expr.__class__ is ast.Name:
        return ALLUNITS[expr.id]
    elif expr.__class__ is ast.Num:
        return expr.n
    elif expr.__class__ is ast.UnaryOp:
        op = expr.op.__class__.__name__
        operand = unit_from_expression(expr.operand)
        if op=='USub':
            return -operand
        else:
            raise SyntaxError("Unsupported operation "+op)
    elif expr.__class__ is ast.BinOp:
        op = expr.op.__class__.__name__
        left = unit_from_expression(expr.left)
        right = unit_from_expression(expr.right)
        if op=='Add':
            u = left+right
        elif op=='Sub':
            u = left-right
        elif op=='Mult':
            u = left*right
        elif op=='Div':
            u = left/right
        elif op=='Pow':
            n = unit_from_expression(expr.right)
            u = left**n
        elif op=='Mod':
            u = left % right
        else:
            raise SyntaxError("Unsupported operation "+op)
        return u
    else:
        raise RuntimeError('You shall not pass')
def unit_from_expression ( expr ) : if expr == '1' : return get_unit_fast ( 1 ) elif isinstance ( expr , str ) : mod = ast . parse ( expr , mode = 'eval' ) expr = mod . body return unit_from_expression ( expr ) elif expr . __class__ is ast . Name : return ALLUNITS [ expr . id ] elif expr . __class__ is ast . Num : return expr . n elif expr . __class__ is ast . UnaryOp : op = expr . op . __class__ . __name__ operand = unit_from_expression ( expr . operand ) if op == 'USub' : return - operand else : raise SyntaxError ( "Unsupported operation " + op ) elif expr . __class__ is ast . BinOp : op = expr . op . __class__ . __name__ left = unit_from_expression ( expr . left ) right = unit_from_expression ( expr . right ) if op == 'Add' : u = left + right elif op == 'Sub' : u = left - right elif op == 'Mult' : u = left * right elif op == 'Div' : u = left / right elif op == 'Pow' : n = unit_from_expression ( expr . right ) u = left ** n elif op == 'Mod' : u = left % right else : raise SyntaxError ( "Unsupported operation " + op ) return u else : raise RuntimeError ( 'You shall not pass' )
Takes a unit string like ``'1. * volt'`` and returns the BRIAN2 unit.
Takes a unit string like 1 . * volt and returns the BRIAN2 unit .