【问题标题】:redefine python function inside other function在其他函数中重新定义python函数
【发布时间】:2018-07-19 12:18:57
【问题描述】:

我可以弄清楚 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)

这将打印:

来自初始 foo 的问候

来自包装器的你好

来自初始 foo 的问候

但我希望:

来自初始 foo 的问候

来自包装器的你好

现在是重载 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()

输出:

来自初始 foo 的问候

现在是重载 foo

【问题讨论】:

  • 寻找装饰器,这些装饰器旨在作为函数包装器

标签: python function overloading wrapper


【解决方案1】:

您只是输错了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)

输出:

从最初的 foo 你好
来自包装器的你好
现在是重载 foo

【讨论】:

  • 在 using_foo() 中(在 wrapper 中称为 func()),我使用 foo(),但似乎在 wrapper() 命名空间中重新定义 foo() 对 func 没有影响定义。
【解决方案2】:

您也可以返回您的内部函数并从外部调用它。对于您当前的示例,这可能是矫枉过正。但是,当您深入了解装饰器时,这种技术肯定会有所帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2023-03-12
    • 2011-09-18
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多