Я могу понять поведение питона. Вот пример кода:
def foo():
print('hello from initial foo')
def using_foo():
foo()
def wrapper(func):
def foo():
print('Now is overload foo')
print('Hello from wrapper')
func()
using_foo()
wrapper(using_foo)
Это напечатает:
hello from initial foo
Hello from wrapper
hello from initial foo
Но я ожидаю:
hello from initial foo
Hello from wrapper
Now is overload foo
Потому что следующий работает нормально:
def foo():
print('Hello from initial foo')
def using_foo():
foo()
using_foo()
if True:
def foo():
print('now it is overload foo')
using_foo()
Выход:
Hello from initial foo
now it is overload foo






Вы только что неправильно набрали func() вместо foo():
def foo():
print('hello from initial foo')
def using_foo():
foo()
def wrapper(func):
def foo():
print('Now is overload foo')
print('Hello from wrapper')
foo()
using_foo()
wrapper(using_foo)
выход:
hello from initial foo
Hello from wrapper
Now is overload foo
в using_foo () (который следует упомянуть внутри оболочки как func ()) я использую foo (), но кажется, что переопределение foo () внутри пространства имен wrapper () не влияет на определение функции.
Вы также можете вернуть свою внутреннюю функцию и вызвать ее извне. Для вашего текущего примера это может быть излишним. Но этот прием наверняка будет полезен, когда вы углубитесь в декораторы.
def foo():
print('hello from initial foo')
def using_foo():
foo()
def wrapper(func):
def foo():
print('Now is overload foo')
print('Hello from wrapper')
return foo
using_foo()
call_inner_foo = wrapper(using_foo)
call_inner_foo()
Ищите декораторы, они предназначены как обертки функций.