Thanks Aaron. The evaluate context is incredibly useful...
Another interesting I've noted is that equality checking of expressions (using == operator, not equals) seem to fail if one subexpression has evaluate set to False whereas an identical expression has the same subexpression set to True. Is this by design -- for more complicated core types -- or a bug?
Here's some sample code to reproduce the issue:
>>> expr_eval_false = sympify('2*x-4', evaluate=False)
>>> expr_eval_false
2*x - 4
>>> expr_eval_true = sympify('2*x-4', evaluate=True)
>>> expr_eval_false == expr_eval_true
False
>>> expr_eval_false.equals(expr_eval_true)
True
I'm interested in comparing sympy expression trees so look forward to some independent work in that area.