Python类中checkArtist方法返回None导致assert断言失败问题排查
问题分析与修复:Song类方法返回None导致断言失败
嘿,我一眼就看出问题出在哪啦!你的checkArtist方法犯了一个很常见的小错误——没有返回计算结果。
在Python里,任何函数或方法如果没有写显式的return语句,执行完后都会默认返回None。你在方法里确实写了判断逻辑:
any(artistname in self._artist for artistname in self._name)
这行代码会正确计算出布尔值True或False,但你没有把这个值返回出去,所以调用song1.checkArtist(...)的时候拿到的都是None,自然会导致断言失败。
而你在类外单独运行逻辑时,直接执行了这个表达式,所以能看到正确的结果——但放到类方法里就必须用return把结果传递出来才行。
修正后的代码
只需要给checkArtist方法加一个return关键字,把any()的结果返回即可:
class Song: def __init__(self, artist, title): self._artist = artist self._title = title def checkArtist(self, name): self._name = name.split() # split to list since just a first name or last name is allowed # 关键:添加return返回计算结果 return any(artistname in self._artist for artistname in self._name) def main_program(): song1 = Song("Lady Gaga and Bradley Cooper", "Shallow") # 现在这两个断言都能正常通过了 assert(song1.checkArtist("Lady Gaga and Bradley Cooper")) assert(song1.checkArtist("Lord Gaga")) main_program()
额外优化建议
其实你不需要把name.split()的结果存到实例属性self._name里,这只是方法内部的临时变量,用局部变量更符合类的封装原则,修改后代码更干净:
def checkArtist(self, name): name_parts = name.split() return any(part in self._artist for part in name_parts)
这样修改后,你的两个测试用例都会正常返回True,断言也就不会再失败啦。
内容的提问来源于stack exchange,提问作者torkestativ
相关产品推荐
相关产品推荐

