module name versus function name resolution conflict.
rocky
rocky at gnu.org
Mon Jul 6 23:13:09 EDT 2009
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?
More information about the Python-list
mailing list