使用事先定义的自定义函数覆盖函数内部的函数

时间:2017-06-27 22:28:40

标签: python

我知道标题非常令人困惑,但基本上我正在努力做到这一点:

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所使用的查找表也很重要。

3 个答案:

答案 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(),您应该使用方法whateverwhatever.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

所以,警告:

你只能为全局函数执行此操作,除非你想要跳过更多的箍。

第二点是,除非你只是为了好玩或绝望而做,否则你应该使用其他方法(如他人所描述的)来达到同样的效果。例如。某种设计模式。