【问题标题】:Changing reference to an outer function更改对外部函数的引用
【发布时间】:2021-04-28 10:48:49
【问题描述】:
def foo():
    print(True)


def bar():
    foo()


def baz():
    def foo():
        print(False)

    foo()
    bar()


baz()

输出:

False
True

我需要让它输出:

False
False  

通过在baz 内部定义bar 调用foo,而不触及baz 本身之外的任何内容。

【问题讨论】:

  • 你为什么要这样做?
  • @forgetso,正在测试。我需要模拟 bar 对 foo 的全局依赖。
  • 啊 - 你可以在 pytest 中 monkeypatch
  • Python 没有动态作用域,python有词法作用域。几乎可以肯定,您应该使用另一种方法
  • @GlebKisenkov 考虑built-in mocking lib

标签: python scope metaprogramming


【解决方案1】:

为此,您需要在全局范围内覆盖foo 的定义。只需使用global 关键字:

def foo():
    print(True)

def bar():
    foo()

def baz():
    global foo

    old_foo = foo # if you want to backup the original definition of foo (optional)

    def foo():
        print(False)

    foo()
    bar()

    foo = old_foo # revert foo to its original state (optional)

    baz()

输出:

False
False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多