如何捕获函数打印内容并执行逻辑,且不修改原函数
解决方法:捕获函数输出并判断,不打印原内容
因为不能修改comparewords.py,我们可以通过临时重定向标准输出的方式,捕获word_compare函数的打印内容,判断后再执行自定义操作,同时不会把原函数的打印内容输出到控制台。
修改后的findtheanagram.py代码:
import sys from io import StringIO from comparewords import word_compare def findanagram(words): for i in words: for j in words: # 跳过自身配对和重复反向配对(比如tar&rat、rat&tar只处理一次) if i >= j: continue # 保存原标准输出,替换为缓冲区 old_stdout = sys.stdout captured_output = StringIO() sys.stdout = captured_output try: # 调用目标函数,此时print内容会写入缓冲区 word_compare(i, j) finally: # 无论执行是否异常,都恢复原标准输出 sys.stdout = old_stdout # 读取捕获的内容并去除首尾空白(包括换行符) output_content = captured_output.getvalue().strip() # 判断是否是目标输出 if output_content == 'Anagram': # 执行自定义打印操作 print(f"{i}:{j}") words = ['tar', 'rat', 'face', 'cafe', 'hello'] findanagram(words)
关键逻辑说明:
- 捕获输出:用
StringIO创建一个内存缓冲区,临时替换系统的stdout,这样word_compare里的print语句会把内容写到这个缓冲区,而不是控制台。 - 恢复输出:用
try...finally保证不管word_compare执行成功还是出错,都能恢复原来的stdout,避免影响后续代码的正常输出。 - 判断执行:读取缓冲区的内容,判断是否等于
'Anagram',是的话执行你需要的打印操作。 - 优化配对:加入
if i >= j跳过重复配对,避免输出重复结果(比如同时输出tar:rat和rat:tar)。
原代码的错误修正:
- 导入路径错误:原代码
from WordCompare应改为from comparewords,对应文件名comparewords.py。 - 判断条件错误:原代码判断
word_compare(i,j) == "Anagrams",但word_compare没有返回值(默认返回None),且原函数打印的是'Anagram'(少了末尾的s)。 - 变量错误:原代码
word[i]应为i,因为i是列表中的元素,不是索引。
内容的提问来源于stack exchange,提问作者Moronis2234
相关产品推荐
相关产品推荐

