rocky wrote: > Someone recently reported a problem in pydb where a function defined > in his program was conflicting with a module name that pydb uses. I > think I understand what's wrong, but I don't have any elegant > solutions to the problem. Suggestions would be appreciated. > > In a nutshell, here's the problem: > > In file fns: > > def foo(): print "foo" > > In file pdebug.py: > > import fns, sys > > def trace_dispatch(frame, event, arg): > fns.foo() > print frame, event, arg > return trace_dispatch > > sys.settrace(trace_dispatch) > execfile('myprogram.py') > > Finally file myprogram.py: > > def fns(): print "This is the *other* fns" > > When you run pdebug.py you get: > > $ python pdebug.py > foo > <frame object at 0xdd9030> call None > foo > <frame object at 0xdd9030> line None > Traceback (most recent call last): > File "pdebug.py", line 7, in <module> > execfile('myprogram.py') > File "myprogram.py", line 1, in <module> > def fns(): print "This is the *other* fns" > File "pdebug.py", line 3, in trace_dispatch > fns.foo() > AttributeError: 'function' object has no attribute 'foo' > > > Basically inside the trace hook, local functions are visible and take > precedence over (global) module names. I could move "import fns" > inside trace_dispatch(), but I'd have to do that in all of the methods > that module "fns" is used. Also note that using the form: > from fns import foo > > would eliminate the conflict on "fns", but I'd still have potential > conflicts on "foo". Using more obscure names (e.g. pydb_fns) would > reduce the chance of a conflict but not eliminate it. > > Suggestions?
Can you run the program in another namespace? execfile("myprogram.py", {"__name__":"__main__"}) Alternatively move trace_dispatch into yet another module and import it into pdebug. from elsewhere import trace_dispatch Peter -- http://mail.python.org/mailman/listinfo/python-list