[Tutor] problems with doctest: apparent interferance between
Brian van den Broek
bvande at po-box.mcgill.ca
Sun Apr 10 22:18:33 CEST 2005
Kent Johnson said unto the world upon 2005-04-10 15:11:
> As John Ridley suggests, you have to balance creation and deletion of
> Wall_clock instances. But unfortunately del wc does not necessarily call
> Wall_clock.__del__() immediately.
Hi Kent and all,
OK, the delay between the statement del(wc) and the call of
Wall_clock.__del__() helps explain a good deal. Thanks for pointing
> See below for more...
> Brian van den Broek wrote:
>> def check_point(self, check_point_name = None):
>> '''Creates a new _Check_point instance; appends it to .data.
>> >>> new_wclock = Wall_clock() # This passes
> You need a matching del new_wclock() here.
>> def interval(self, interval_name = None):
>> >>> same_name = wclock.interval('F')
>> Traceback (most recent call last):
> You need a matching del wclock here. BUT it still doesn't work because
> __del__() doesn't get called.
> If you read the Note under the description of __del__() on this page
> it says that in the case of an exception, references are retained in the
> stack track object. I tried the workarounds suggested with no luck. but
> taking out the line that causes the exception (and adding the missing
> del) does in fact make the test work.
OK, that's helpful; thanks. Making the changes you suggest does indeed
fix the failure problem. :-)
But: it still leaves me wondering why removing either a) the one-line
no-doctest-containing docstring of the Wall_clock class or b) the
unreferenced Wall_clock.stop_interval method made my original test
code pass without needing to effect the changes you suggest. That
seems really odd to me.
> As far as doctests being independent, each doctest has it's own copy
> globals(). But your class has its own internal state, this is not
> affected by globals(). Basically there are side-effects to the use of
> your class; doctest can't account for them.
I've not fully grokked the doctest code (which I delved into after Lee
Harr suggested I do so), but I would have thought that each doctest
had its own copy of the Wall_clock class from copying globals. But
here, I surely have more work to do myself :-)
> Personally I don't see any compelling reason why Wall_clock() should be
> a singleton. It could easily be a module with global functions and
> global state, or you could allow clients to have multiple instances to
> time different things.
I'm not sure I see a reason anymore, either. :-)
The code that I removed before posting allows for multiple things to
be timed, but all timings are relative to the first instantiation of
the Wall_clock class. _Check_points, on creation, store how many
seconds have elapsed since the Wall_clock instance was created,
_Intervals how long between their start and stop signals, as well as
how long from Wall_clock instance creation their start signal was
sent. The thought was that the results would be easier to interpret
were all timings relative to a single initiation point, rather than
having timings of instance 1 relative to instance 1's initiation, and
instance 2's relative to its.
From a usability standpoint, I think I have settled on a Borg, where
the first instances start time is the one to which all timings will be
But, in a way, which route is best is something of a side issue
(though I do appreciate the input). I took this up to primarily to
explore various possible structures just for learning about them.
So, apart from the open questions (about why the unreferenced method
and the no-doctest class docstring made a difference), I think I can
count my original problem solved. I know how to make my tests work as
excepted, and that is the main thing.
Sincere thanks to everyone who worked their way through my mammoth
original post; I very much appreciate the contributions!
Best to all,
More information about the Tutor