[IPython-dev] Changing functions in a running program?

Wes Turner wes.turner at gmail.com
Mon Jan 14 11:02:38 EST 2019


There are likely more convenient patterns for a functionally composed
signal processing pipeline; though ipdb may be good enough.
https://pypi.org/project/pdbpp/ supports {tab-completion,}

Decomposing to functions that accept state with a standard interface like
{data: [], kwargs: {}} may have advantages.
You can assign the output of one step of the pipeline to a global; or, more
ideally, a key of a dict (or an attribute of a class instance); so you
don't need to modify globals() from a different scope.

The Jupyter notebook way to do this would be to put the first processing
stage in one cell, and then work with it in the next. e g. Spyder and
VSCode support markers in Python sources so that you can execute a
top-level block of code at a time.

I'm not too familiar with signal processing. Someone has likely already
distilled the workflow into some standard interfaces like
sklearn.pipeline.Pipeline.steps?
https://scikit-learn.org/stable/modules/compose.html#pipeline

/q="scikit signal"
- scipy.signal
- scikit-signal

/q="python signal processing"
- http://greenteapress.com/thinkdsp/html/
- https://github.com/unpingco/Python-for-Signal-Processing (ipynb)



# This logs IPython input and output to a file;
# but not ipdb i/o AFAIU
%logstart -o example.py
%logstart -h

To avoid logging code that modifies globals(),
it's probably better and more convenient to pass print_name as an argument
to name():

def name(print_name=print_name):
    print_name()

With a config dict/object:

def name(conf):
    print_name = conf['print_name']
    print_name(conf['data'])


On Monday, January 14, 2019, Andreas Yankopolus <andreas at yank.to> wrote:

> Thomas,
>
> If you define a function or variable at the breakpoint, it's
> probably making it a local variable inside main(), so it's not in scope for
> name().
>
> You may be able to get round this by defining the new function and
> then explicitly making it a global variable, something like this:
>
> globals()['print_name'] = print_name
>
> Not exactly elegant, but hopefully it works.
>
>
> Yes—makes sense and does the trick! I’ll have to figure out an Emacs hook
> to automatically update globals in that manner. My output:
>
> In main.
> > /Users/ayank/Documents/programming/python/bar.py(13)main()
>      12     import ipdb; ipdb.set_trace()
> ---> 13     name()
>      14
>
> ipdb> name()
> Alice
> ipdb> !def print_name(): print ("Bob")
> ipdb> name()
> Alice
> ipdb> globals()['print_name'] = print_name
> ipdb> name()
> Bob
> ipdb>
>
> To follow up on Wes’s comment regarding TDD—I’m writing signal processing
> code and using Python + SciPy like Matlab. There are some calculations when
> the code starts that take a few minutes. I have a breakpoint there and am
> experimenting with the next steps of the processing chain.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ipython-dev/attachments/20190114/e61d86ef/attachment.html>


More information about the IPython-dev mailing list