If you are trying to have your students develop a symbolic library by themselves, programming something like n() would indeed be quite nontrivial, since you have to use a specific numeric algorithm to find an arbitrary precision approximation for any object that is in the library.
You could settle for a partial solution by casting to float, if you don't really need arbitrary precision. You could tell them to define the __float__ method for the objects in the module for which casting to float make sense. For things like integrals they could use a simple numerical method with error estimates. It would not be production code, but still a good exercise.
If you want to use pure Python, you can "fake" it using sympy, which is a small symbolic library in Python. It has functionality analogous to n(), and has a nice interface to numpy/scipy (check the function lambdify). I use it with a numerical methods course where they have to learn pure Python (so I can't use Sage), to do things like computing the equations of motion from a Lagrangian and then solving the equations numerically.
Felipe Martins
Sent from my iPad