module name versus function name resolution conflict.

Peter Otten __peter__ at web.de
Tue Jul 7 08:33:48 CEST 2009


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





More information about the Python-list mailing list