假设Python中有一个函数function
,它通过循环工作:例如,它可以是一个为数组中的所有元素(例如([1, 2, ..., 100])
)计算某个数学表达式(例如x**2
)的函数(显然这是一个玩具示例)。是否可以编写一个代码,使得每次function
经过循环并获得结果时,都会执行一些代码,例如print("Loop %s has been executed" % i)
?因此,在我们的例子中,当计算了x**1
时,程序打印Loop 1 has been executed
,然后当计算了x**2
时,它打印Loop 2 has been executed
,依此类推
请注意,困难在于我没有对函数进行编程,它是某个包中预先存在的函数(更具体地说,我感兴趣的函数是包scikit learn
中的GridSearchCV
)。
实现这一点的最简单方法是将函数的代码复制到您自己的函数中,对其进行调整,然后使用它。在您的情况下,您必须将GridSearchCV
子类化并覆盖_fit
方法。这种方法的问题在于,它可能无法在包升级后幸存下来。
在你的情况下,这是没有必要的。您可以在创建对象时指定一个详细级别:
GridSearchCV(verbose=100)
我不完全确定这个冗长的数字本身意味着什么。以下是内部用于打印的包中的文档:
详细级别:如果不是零,则打印进度消息。高于50时,输出被发送到stdout。消息的频率随着详细程度的增加而增加。如果它超过10,则报告所有迭代。
如果您真的想知道verbosity
数字的作用,可以查看源代码。我说不出来。
您可能会使用monkey补丁("monkey"是因为它很黑客)
假设库函数为
def function(f):
for i in range(100):
i**2
如果你想输入一个打印语句,你需要将整个函数复制到你自己的文件中,并进行微小的编辑:
def my_function(f):
for i in range(100):
i**2
print ("Loop %s" % i)
现在您覆盖库函数:
from library import module
module.existing_function = my_function
显然,这不是一个易于维护的解决方案(如果您的目标库已升级,您可能需要再次经历此过程),因此请确保仅将其用于临时调试目的。