doctest中换行符 不生效:如何让多行字符串正常换行显示?
解决Doctest中多行字符串显示转义字符的问题
这个问题我之前也碰到过,doctest的字符串匹配是完全字面量匹配,它不会自动解析字符串里的\n为换行,而是把它当作普通字符显示,所以才会出现你看到的情况。下面给你几个可行的解决方案:
方案1:在Doctest中检查打印输出(最符合你的预期)
既然print能正常显示换行,那直接在doctest里调用print来验证输出就好了。这样doctest会捕获print的实际输出(已经解析了换行),和你写的多行预期对比:
def your_song_format_method(self): """ >>> # 先创建你的类实例并设置测试数据 >>> class SongCollection: ... def __init__(self): ... self.songs = [] ... def your_song_format_method(self): ... song_num=1 ... # 注意:这里假设你的result初始值是第一个歌曲,不然会有开头空行 ... result = str(self.songs[0]) ... for song in self.songs[1:]: ... result+='\n'+str(song_num)+'. '+str(song) ... song_num+=1 ... return str(result) >>> sc = SongCollection() >>> sc.songs = ["CAnadian artist (8:18)", "A, B (3:15)", "AA, BB (5:03)"] >>> print(sc.your_song_format_method()) CAnadian artist (8:18) 1. A, B (3:15) 2. AA, BB (5:03) """ # 你的实际代码 song_num=1 result = str(self.songs[0]) for song in self.songs[1:]: result+='\n'+str(song_num)+'. '+str(song) song_num+=1 return str(result)
这样运行doctest时,就会和你想要的多行预期完全匹配。
方案2:调整Doctest预期为字符串字面量
如果一定要直接检查函数的返回值,那你需要把预期写成包含转义\n的字符串(注意在docstring里要写\\n,因为docstring会自动解析单个\n为换行):
def your_song_format_method(self): """ >>> sc = SongCollection() >>> sc.songs = ["CAnadian artist (8:18)", "A, B (3:15)", "AA, BB (5:03)"] >>> sc.your_song_format_method() 'CAnadian artist (8:18)\\n1. A, B (3:15)\\n2. AA, BB (5:03)' """ # 你的代码
这种方法虽然能通过测试,但可读性不如方案1,毕竟你想要的是直观的多行显示。
额外小提示:优化你的字符串拼接代码
顺便提一句,你的字符串拼接方式可以用更Pythonic的写法,比如用join和生成器表达式,效率更高也更简洁:
def your_song_format_method(self): if not self.songs: return "" # 第一个歌曲直接显示,后面的带编号 lines = [self.songs[0]] + [f"{i}. {song}" for i, song in enumerate(self.songs[1:], start=1)] return '\n'.join(lines)
这样生成的字符串和你原来的逻辑完全一致,但代码更清晰。
内容的提问来源于stack exchange,提问作者user9121776
相关产品推荐
相关产品推荐

