We have decided to use this instead of jupyter notebooks.

Issue: When using multiple files, you need to restart your instance to pick up changes made in other files.

Fix: Use autoreload. https://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html

Please explain how to avoid having to restart the kernel to have the changes in some_function() be reflected when executing the cell again.

from foo import some_function

some_function()
Out[4]: 42

# open foo.py in an editor and change some_function to return 43

some_function()
Out[6]: 42 # still 42!! We need to restart the Kernel

?

%load_ext autoreload
%autoreload 2

from foo import some_function

some_function()
Out[4]: 42

# open foo.py in an editor and change some_function to return 43

some_function()
Out[6]: 43 # No need to restart the kernel

Yes it is possible to only reload certain functions. Check the documentation if that is necessary.