有什么方法可以更改函数外部定义的变量或函数

时间:2019-06-17 03:09:51

标签: python

假设我有MathBox.Text,如下所示。 该文件不是我创建的,因此我既不想修改也不能复制它。 换句话说,foo.py在我安装的某些额外软件包中。

foo.py

然后,我想将# foo.py def bar(): print('This is bar') def foo(): print('something') bar() print('something') 表现为注释。

foo_as_baz()

我尝试过以下方法之一,但由于名称范围不同,因此无法正常工作。

# baz.py

from foo import foo

def baz():
  print('This is baz')

def foo_as_baz():
"""
This function is expected to behave as below
  print('something')
  baz()
  print('something')
"""  
  pass

2 个答案:

答案 0 :(得分:0)

您可以通过稍微修改foo的工作方式来将函数本身作为参数传递给foo

def foo(func=bar):
   print('something')
   func()
   print('something')

def foo_as_baz():
   foo(baz)

通过将bar添加为foo的默认参数,可以保留原始行为

答案 1 :(得分:0)

记录下来:不要在普通代码中做低于水平线的事情。这很混乱,而且毫无意义。

如果您正在做这种事情来测试代码,我建议使用标准库unittest.mock软件包,该软件包提供了一种系统的方法来用伪造的Python对象替换Python对象以进行测试。

如果您认为自己有一些真正的非测试用例,请详细说明...


# foo.py

def bar():
    print("This is bar")

def foo():
    print("something")
    bar()
    print("something")

然后在另一个文件中:

import foo


def baz():
    print("This is baz")


def foo_as_baz():
    original = foo.bar  # save a copy of the original bar()

    foo.bar = baz       # make foo.bar point to baz()

    foo.foo()           

    foo.bar = original  # cleanup by restoring bar()


foo_as_baz()

与您尝试的主要区别在于我做了import foo,这使我可以了解实际的模块命名空间foo。我将foo.bar交换为baz,然后调用foo.foo(),然后将foo.bar切换回原始的bar函数。

之所以可行,是因为功能实际上是模块的属性。因此,我们可以重新分配这些属性,就好像它们是任何其他对象的属性一样(因为在Python中,包括模块在内的所有事物都是对象)。