假设我有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
答案 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中,包括模块在内的所有事物都是对象)。