AssertionError 被引发是因为您的函数返回了错误的结果,而测试 asserts 则返回了正确的结果(这是单元测试通常的工作方式)。根据错误消息,它应该返回一个字符串列表,但它却返回了None(也就是说,它不仅返回了错误的结果,而且完全返回了错误的对象类型)。
为了产生这个结果,有很多 很多 错误堆积在一起——我不认为这个函数的任何一行都在做你想让它做的事情。我会尽力逐个解释所有的错误。
你的代码 sn-p 的缩进被完全弄乱了;整个函数体必须缩进(取消缩进表示函数结束)。我希望一个完全空的函数体会产生一个 IndentationError,因此您实际运行测试的代码必须与您粘贴到上面问题中的代码不同。如果函数的整个主体再缩进两个级别,它将运行并返回None(如测试失败消息中所示),所以我认为这就是您实际使用的。
类型注释在技术上是有效的,但没有用;键入 object 就像没有类型注释一样。类型注解的主要目的是帮助你(和其他人)理解代码是如何工作的;不用说,一切都是object,因此以这种方式注释一切并不会增加任何理解。如果你能更具体的说str_list是一个list,char是一个str,并且函数返回另一个list,就更容易理解这个函数在做什么以及它是如何工作的。如果您可以更具体一点,并说这是一个List[str](字符串列表),那就更有帮助了!
通过将str_list 和char 重新分配给空值(覆盖参数)来启动您的函数,确保不可能返回有效结果。另请注意,您将tuple 分配给str_list,并将list 分配给char。
即使随后的循环能够生成正确的结果为str_list,您返回的是object 而不是str_list,因此调用者接收到“对象”类型 而不是实际的str_list 对象(它应该是一个列表,但实际上是一个元组)。
最重要的是,由于返回发生在循环体内(它永远不会执行,因为您正在迭代一个空元组,这是因为您在一开始就覆盖了str_list),它实际上从未发生过,这就是函数返回None的原因。
这是该函数的工作(并且输入正确)版本:
from typing import List
def remove_char(str_list: List[str], char: str) -> List[str]:
new_list: List[str] = []
for value in str_list:
new_value = value.replace(char, '')
new_list.append(new_value)
return new_list
请注意,我们正在构建一个全新的列表(而不是修改原始的 str_list),并对列表中的单个 values 执行 replace(我们通过迭代 @987654349 @ 循环 str_list),而不是列表本身。
这里是同一个函数的一个更简单的版本;这与上面的代码几乎完全相同,但作为一个列表理解语句:
from typing import List
def remove_char(str_list: List[str], char: str) -> List[str]:
return [value.replace(char, '') for value in str_list]
正如我在 cmets 中所说,我对未来的建议是仔细阅读和编写您的代码,一次一行 - 如果您不知道代码的确切用途,请不要编写代码,并且有理由希望它做那件事。如果您不知道每一行代码在做什么,那么很难在程序中找到错误。如果您不知道如何做某件事,请向您的老师寻求帮助,而不是编写一个损坏的程序,然后试图让其他人为您重写它。它在某些时候会起作用(就像这次一样),但它不太可能让你通过编程课程。
祝你好运!