Переопределить функцию Python внутри другой функции

Я могу понять поведение питона. Вот пример кода:

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

Ищите декораторы, они предназначены как обертки функций.

DDS 19.07.2018 14:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
62
2

Ответы 2

Вы только что неправильно набрали 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 () не влияет на определение функции.

D.Shaulskii 19.07.2018 18:47

Вы также можете вернуть свою внутреннюю функцию и вызвать ее извне. Для вашего текущего примера это может быть излишним. Но этот прием наверняка будет полезен, когда вы углубитесь в декораторы.

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()

Другие вопросы по теме