【问题标题】:trying to remove char from str in list; getting assertion error试图从列表中的 str 中删除 char;得到断言错误
【发布时间】:2021-03-28 17:29:09
【问题描述】:

甚至不知道“断言错误”是什么,但我试图通过我的类测试模块运行它并得到以下错误:

文件“/var/gt_test_envs/iVpgS6thyOoxSD9V/wrk/homeworkTests.py”,第 201 行,在 test_remove_char self.assertEqual(预期,返回) AssertionError: ['pZlp', 'Bn', 'GaFu', 'sMopFKjxl', 'IZhhtE'] != None

代码如下:

    def remove_char(str_list: object, char: object)-> object:
str_list = ()
char = []
for value in char:
    str_list = str_list.replace(value, '')
    return object

【问题讨论】:

  • asserts 测试 expected 列表等于您的函数返回的值。如果两者不相等,则会引发错误,导致测试失败。
  • 哦,好吧,这只是说我的代码返回了不正确的字符串。感谢您的澄清 - 这个让我难过!
  • 我的建议是一次写出并测试你的函数一行,这样你就可以了解每一行到底在做什么。看起来您目前正在通过组合您在其他代码中看到的单词和符号而不理解它们的含义来完全随机地尝试事情——通过随机猜测“正确答案”是什么,最终有可能得到一个工作程序,但是仅适用于非常非常小的功能,即使这样也需要一段时间!

标签: python python-3.x string list char


【解决方案1】:

AssertionError 被引发是因为您的函数返回了错误的结果,而测试 asserts 则返回了正确的结果(这是单元测试通常的工作方式)。根据错误消息,它应该返回一个字符串列表,但它却返回了None(也就是说,它不仅返回了错误的结果,而且完全返回了错误的对象类型)。

为了产生这个结果,有很多 很多 错误堆积在一起——我不认为这个函数的任何一行都在做你想让它做的事情。我会尽力逐个解释所有的错误。

你的代码 sn-p 的缩进被完全弄乱了;整个函数体必须缩进(取消缩进表示函数结束)。我希望一个完全空的函数体会产生一个 IndentationError,因此您实际运行测试的代码必须与您粘贴到上面问题中的代码不同。如果函数的整个主体再缩进两个级别,它将运行并返回None(如测试失败消息中所示),所以我认为这就是您实际使用的。

类型注释在技术上是有效的,但没有用;键入 object 就像没有类型注释一样。类型注解的主要目的是帮助你(和其他人)理解代码是如何工作的;不用说,一切都是object,因此以这种方式注释一切并不会增加任何理解。如果你能更具体的说str_list是一个listchar是一个str,并且函数返回另一个list,就更容易理解这个函数在做什么以及它是如何工作的。如果您可以具体一点,并说这是一个List[str](字符串列表),那就更有帮助了!

通过将str_listchar 重新分配给空值(覆盖参数)来启动您的函数,确保不可能返回有效结果。另请注意,您将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 中所说,我对未来的建议是仔细阅读和编写您的代码,一次一行 - 如果您不知道代码的确切用途,请不要编写代码,并且有理由希望它做那件事。如果您不知道每一行代码在做什么,那么很难在程序中找到错误。如果您不知道如何做某件事,请向您的老师寻求帮助,而不是编写一个损坏的程序,然后试图让其他人为您重写它。它在某些时候会起作用(就像这次一样),但它不太可能让你通过编程课程。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2023-03-19
    • 2021-10-31
    相关资源
    最近更新 更多