Question on importing and function defs
TC
cappallo at gmail.com
Sun Mar 2 11:52:27 EST 2008
On Mar 2, 11:37 am, Gary Herron <gher... at islandtraining.com> wrote:
> TC wrote:
> > I have a problem. Here's a simplified version of what I'm doing:
>
> > I have functions a() and b() in a module called 'mod'. b() calls a().
>
> > So now, I have this program:
>
> > from mod import *
>
> > def a():
> > blahblah
>
> > b()
>
> > The problem being, b() is calling the a() that's in mod, not the new
> > a() that I want to replace it. (Both a()'s have identical function
> > headers, in case that matters.) How can I fix this?
>
> > Thanks for any help.
>
> Since b calls mod.a, you could replace mod.a with your new a. Like
> this: (Warning, this could be considered bad style because it will
> confuse anyone who examines the mod module in an attempt to understand
> you code.)
>
> import mod
>
> def replacement_a():
> ...
>
> mod.a = replacement_a
>
> ...
>
> Or another option. Define b to take, as a parameter, the "a" function
> to call.
>
> In mod:
>
> def a():
> ...
>
> def b(fn=a): # to set the default a to call
> ...
>
> And you main program:
>
> from mod import *
>
> def my_a():
> ...
>
> b(my_a)
>
> Hope that helps
>
> Gary Herron
Thanks for the tips, but no luck. This is for a homework assignment,
so there are a couple of requirements, namely that I can't touch
'mod', and I have to do 'from mod import *' as opposed to 'import
mod'.
So the first method you suggested won't work as written, since the mod
namespace doesn't exist. I tried a = replacement_a, but b() is still
calling mod's version of a() for some reason. And because I can't
touch mod, I can't use your second suggestion.
In case I somehow oversimplified, here's the actual relevant code, in
'mod' (actually called 'search'). The first fn is what I've been
calling a(), the second is b().
(lots of stuff...)
def compare_searchers(problems, header,
searchers=[breadth_first_tree_search,
breadth_first_graph_search,
depth_first_graph_search,
iterative_deepening_search,
depth_limited_search,
astar_search]):
def do(searcher, problem):
p = InstrumentedProblem(problem)
searcher(p)
return p
table = [[name(s)] + [do(s, p) for p in problems] for s in
searchers]
print_table(table, header)
def compare_graph_searchers():
compare_searchers(problems=[GraphProblem('A', 'B', romania),
GraphProblem('O', 'N', romania),
GraphProblem('Q', 'WA', australia)],
header=['Searcher', 'Romania(A,B)', 'Romania(O, N)',
'Australia'])
That's the end of the 'search' file. And here's my program, which
defines an identical compare_searchers() with an added print
statement. That statement isn't showing up.
from search import *
def compare_searchers(problems, header,
searchers=[breadth_first_tree_search,
breadth_first_graph_search,
depth_first_graph_search,
iterative_deepening_search,
depth_limited_search,
astar_search, best_first_graph_search]):
def do(searcher, problem):
p = InstrumentedProblem(problem)
searcher(p)
return p
table = [[name(s)] + [do(s, p) for p in problems] for s in
searchers]
print 'test'
print_table(table, header)
compare_graph_searchers()
More information about the Python-list
mailing list