git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

pre-edit stuff persists in a reloaded a module



On 10/5/19 2:48 PM, Peter Otten wrote:
> Friedrich Rentsch wrote:
>
>> Hi all,
>>
>> Python 2.7. I habitually work interactively in an Idle window.
>> Occasionally I correct code, reload and find that edits fail to load. I
>> understand that reloading is not guaranteed to reload everything, but I
>> don't understand the exact mechanism and would appreciate some
>> illumination. Right now I am totally bewildered, having deleted and
>> garbage collected a module and an object, reloaded the module and remade
>> the object and when I inspect the corrected source (inspect.getsource
>> (Object.run)) I see the uncorrected source, which isn't even on the disk
>> anymore. The command 'reload' correctly displays the name of the source,
>> ending '.py', indicating that it recognizes the source being newer than
>> the compile ending '.pyc'. After the reload, the pyc-file is newer,
>> indicating that it has been recompiled. But the runtime error persist.
>> So the recompile must have used the uncorrected old code. I could kill
>> python with signal 15, but would prefer a targeted purge that doesn't
>> wipe clean my Idle workbench. (I know I should upgrade to version 3. I
>> will as soon as I get around to it. Hopefully that will fix the problem.)
>>
>> Thanks for comments
> (1) stay away from reload()
> (2) inspect.getsource() uses a cache that you should be able to clear with
> linecache.clear():
>
> $ echo 'def f(): return "old"' > tmp.py
> $ python
> [...]
>>>> import inspect, tmp
>>>> inspect.getsource(tmp.f)
> 'def f(): return "old"\n'
> [1]+  Angehalten              python
> $ echo 'def f(): return "new"' > tmp.py
> $ fg
> python
> reload(tmp)
> reload(tmp)
> <module 'tmp' from 'tmp.py'>
>>>> inspect.getsource(tmp.f)
> 'def f(): return "old"\n'
>>>> import linecache; linecache.clearcache()
>>>> inspect.getsource(tmp.f)
> 'def f(): return "new"\n'
>
> (3) see 1 ;)
>
Thank you, Peter. I guess, then, that not only 'inspect', but the 
compiler as well reads source off the line cache and clearing the latter 
would make 'reload' work as expected. Are there other snags lurking, 
that you advise against using 'reload'? What are the alternatives for 
developing iteratively, alternating between running and editing?

Frederic