[Python-Dev] Directions for reproducing the coredump
Tim Peters
tim_one@email.msn.com
Sat, 12 Aug 2000 03:32:17 -0400
[Eric S. Raymond, with a lot of code that dies in a lot of pain]
Eric, as I'm running on a Windows laptop right now, there's not much I can
do to try to run this code. However, something struck me in your patch "by
eyeball", and here's a self-contained program that crashes under Windows:
# This is esr's new class.
class Requirement:
"A requirement, together with a message to be shown if it's violated."
def __init__(self, wff, message=None):
self.predicate = wff
self.message = message
def str(self):
return display_expression(self.predicate)
def __repr__(self):
if self.message:
return self.message
else:
return str(self)
# This is my driver.
r = Requirement("trust me, I'm a wff!")
print r
Could that be related to your problem? I think you really wanted to name
"str" as "__str__" in this class (or if not, comment in extreme detail why
you want to confuse the hell out of the reader <wink>). As is, my
print r
attempts to get look up r.__str__, which isn't found, so Python falls back
to using r.__repr__. That *is* found, but r.message is None, so
Requirement.__repr__ executes
return str(self)
And then we go thru the whole "no __str__" -> "try __repr__" -> "message is
None" -> "return str(self)" business again, and end up with unbounded
recursion. The top of the stacktrace Ping posted *does* show that the code
is failing to find a "__str__" attr, so that's consistent with the scenario
described here.
If this is the problem, note that ways to detect such kinds of unbounded
recursion have been discussed here within the last week. You're a clever
enough fellow that I have to suspect you concocted this test case as a way
to support the more extreme of those proposals without just saying "+1"
<wink>.