'Evaluate objects that are not evaluated by default like limits,
integrals, sums and products. All objects of this kind will be
evaluated recursively, unless some species were excluded via \'hints\'
or unless the \'deep\' hint was set to \'False\'.
>>> from sympy import Integral
>>> from sympy.abc import x
>>> 2*Integral(x, x)
2*Integral(x, x)
>>> (2*Integral(x, x)).doit()
x**2
>>> (2*Integral(x, x)).doit(deep=False)
2*Integral(x, x)'

def doit(self, **hints):

    if hints.get('deep', True):
        terms = [(term.doit(**hints) if isinstance(term, Basic) else term) for term in self.args]
        return self.func(*terms)
    else:
        return self
