Python 使用预先定义的自定义函数重写函数内部的函数

Python 使用预先定义的自定义函数重写函数内部的函数,python,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提供一个

我知道这个标题很让人困惑,但基本上我想做的是:

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\u foo
中生成的。对我来说,使用函数
bar
的人不需要知道其中bar正在使用的查找表,这一点也很重要

如果我正确理解了您的问题,您可以将函数传递给
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)

这将不起作用,因为
foo()
将在其定义的命名空间中查找
bar
引用的函数,而不是在其调用的命名空间中

这种情况就是对象继承的目的,而不是让函数
foo()
使用方法
whater.foo()
whater.bar()
将其重新设计为对象
whater
。然后,您可以对
任何对象进行子类化,并编写一个新方法
bar()
,该方法
foo()
将找到,因为它是在类名称空间中定义的


可能您想这样做是因为您不控制
foo()
,因此无法将其从函数转换为方法。在这种情况下,您可以通过在定义了
foo()
的同一名称空间中对
bar()
进行猴子补丁来实现这一点,但这是一种通常不受欢迎的深黑色巫术。

如果我理解正确,您希望全局覆盖函数定义。下面的内容并不漂亮,但它是有效的(下面有一些注意事项):

输出是

baz
local foo
因此,需要注意的是:

您只能对全局函数执行此操作,除非您想跳过更多的障碍


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

bar
evaluate\u foo
的本地模式
foo
无法看到它。你想完成什么?请你把你想做的事情说清楚一点好吗。p、 您无法从fooPython访问bar。Python具有词法范围。听起来好像你想让它起作用。@Coldspeed我已经更新了这个例子,以便更清楚地了解我要做的事情。
baz
local foo