Whether or not the variables are real does not matter. The question is
what domain sympy can use to factor the denominator. By default it
only tries to factor over the rationals. In this case it factors in
the Gaussian integers which are given by the extension ZZ[I] where ZZ
is the ring of integers and I is sqrt(-1):
>>> apart(num/den, extension=I)
(1/2 - I/2)/(s + 2 + 3*I) + (1/2 + I/2)/(s + 2 - 3*I)
More generally the extension needs to generate a field over which the
denominator factors so you need to pass the roots of the denominator:
>>> apart(num/den, extension=roots(den, s, multiple=True))
(1/2 - I/2)/(s + 2 + 3*I) + (1/2 + I/2)/(s + 2 - 3*I)
We should probably make it so that extension=True or something can
compute this automatically.
Oscar