我知道标题非常令人困惑,但基本上我正在努力做到这一点:
def foo():
bar(name)
def evaluate_foo(name_table):
def bar(name, lookup_table=name_table):
print(name + "'s last name is " + lookup_table[name])
foo()
基本上,如果我知道foo
将打电话给bar
,我可以在调用foo之前用我自己的函数替换bar
吗?
我正在尝试向bar提供查找表,但查找表是在evaluate_foo
内生成的。对我来说,使用函数bar
的人不需要了解其中的bar所使用的查找表也很重要。
答案 0 :(得分:1)
如果我理解你的问题,你可以将你的功能传递给foo
来执行。例如,你可以这样做:
def foo(f):
f()
def evaluate_foo(some_param):
baz = some_param.get_special_number()
def bar(bar_param=baz):
print("Bar's result is " + str(baz))
foo(bar)
答案 1 :(得分:1)
这不起作用,因为foo()
将在其定义的命名空间中查找bar
引用的函数,而不是它所调用的命名空间。
这种情况是对象继承的用途,而不是使用函数foo()
,您应该使用方法whatever
和whatever.foo()
将其重新设计为对象whatever.bar()
。然后你可以继承whatever
并编写bar()
将找到的新方法foo()
,因为它是在类名称空间中定义的。
大概你想要这样做,因为你不能控制foo()
,因此你无法将它从函数转换为方法。在这种情况下,您可以通过在bar()
定义的同一名称空间中修补foo()
来实现此目的,但这通常是不鼓励的深色伏都教。
答案 2 :(得分:1)
如果我理解正确,您希望全局覆盖函数定义。以下不是很好,但它有效(下面有一些警告):
def foo():
print("foo")
def baz():
print("baz")
foo()
def bar():
def local_foo():
print("local foo")
global foo
foo = local_foo
baz()
if __name__ == "__main__":
bar()
输出
baz
local foo
所以,警告:
你只能为全局函数执行此操作,除非你想要跳过更多的箍。
第二点是,除非你只是为了好玩或绝望而做,否则你应该使用其他方法(如他人所描述的)来达到同样的效果。例如。某种设计模式。