Constructing an if statement from the client data in python

Chris Rebert clp2 at rebertia.com
Tue Apr 13 16:08:27 EDT 2010


> On Tue, Apr 13, 2010 at 12:29 PM, Chris Rebert <clp2 at rebertia.com> wrote:
>> On Tue, Apr 13, 2010 at 8:56 AM, Vishal Rana <ranavishal at gmail.com> wrote:
>> > Hi,
>> >
>> > I need to construct an if statement from the data coming from the client
>> > as
>> > below:
>> >
>> > conditions: condition1, condition2, condition3, condition4 logical
>> > operators: lo1, lo2, lo3 (Possible values: "and" "or")
>> >
>> > Eg.
>> >
>> > if condition1 lo1 condition2 lo3 condition4:
>> >
>> >     # Do something
>> >
>> > I can think of eval/exec but not sure how safe they are! Any better
>> > approach
>> > or alternative? Appreciate your responses :)
>> >
>> > PS: Client-side: Flex, Server-side: Python, over internet
>>
>> Do you literally get a string, or do/could you get the expression in a
>> more structured format?

On Tue, Apr 13, 2010 at 12:46 PM, Vishal Rana <ranavishal at gmail.com> wrote:
> Its a form at the client side where you can construct a query
> using different conditions and logical operators.
> I can take it in any format!, currently it comes as a parameters to an RPC.

Well, then if possible, I'd have the form send it back in a Lisp-like
format and run it through a simple evaluator:

def and_(conds, context):
    for cond in conds:
        if not evaluate(cond, context):
            return False
    return True

def or_(conds, context):
    for cond in conds:
        if evaluate(cond, context):
            return True
    return False

def greater_than(pair, context):
    left, right = [context[name] for name in pair]
    return left > right

OPNAME2FUNC = {"and" : and_, "or" : or_, ">" : greater_than}

def evaluate(expr, context):
    op_name, operands = expr[0], expr[1:]
    return OPNAME2FUNC[op_name](operands, context)

expression = ["and", [">", "x", "y"], ["or", [">", "y", "z"], [">", "x", "z"]]]
variables = {"x" : 7, "y" : 3, "z" : 5}
print evaluate(expression, variables)

If it's just ands and ors of bare variables (no '>' or analogous
operations), the code can be simplified a bit.

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list