A Poly object considers itself to be a polynomial function of some
generator so Poly(O(x**4)) is a polynomial function of O(x**4). Notice
that when you call integrate here you don't specify what variable you
want to integrate with respect to but if you had specified
exp.integrate(x) you would have seen an error because the Poly
considers itself to be a function of O(x**4) rather than x.
There is no way that Poly can do anything sensible with something
O(x**4) so just don't use Poly for this:
>>> O(x**4).integrate(x)
O(x**5)
Calculus with big-O objects is still questionable but SymPy currently
has the behaviour you expect for integration and differentiation.
--
Oscar