【问题标题】:assert menu.__str__() == "" AssertionError断言 menu.__str__() == "" AssertionError
【发布时间】:2021-12-11 04:43:51
【问题描述】:

当我尝试将“”(空字符串)断言到 str 函数时出现断言错误。谁能告诉我为什么会发生这种情况。这里完全没有头绪。我知道 str 函数需要返回一个字符串,但据我所知,它在我运行时返回一个字符串:

运行时出现错误:

menu = Menu() 
assert menu.str() == "" 

这是我的代码:


    class Node:

    def __init__(self):
        self.counter = counter
        my_list = []
        self.my_list = my_list
        

    def __str__(self):
        for element in self.a_list:
            if element:
                return "\n".join(f"{counter}. {element}" for counter, 
                element in enumerate(self.my_list, 1)) 
            print()
    
          

【问题讨论】:

  • x.str()str(x) 不同,后者调用x.__str__()
  • 我想你想要assert str(menu)=="",但即使这样也是无效的。如果您的对象为空,您的 __str__ 函数将返回 None,而不是空字符串。也许assert not menu.str() 会更好。
  • 另外,你应该调试你的代码。当你真的print(repr(menu.str())) 时会发生什么?是空字符串吗?
  • 嗯,它返回属性错误
  • 什么是完整的属性错误信息?它是否说“没有属性'str'”?您的示例中没有 str 方法,您的 assert menu.str() == "" 应该以同样的方式失败。

标签: python class


【解决方案1】:

由于声明是def __str__(self):,你需要这样称呼它

assert menu.__str__() == ""

或者使用str方法

assert str(menu) == ""

您还有一个 for 循环,其中包括同一 a_list 上的另一个循环。一个好的实现是

# with classic for loop syntax
def __str__(self):
    result = ""
    for counter, element in enumerate(self.a_list, 1):
        result += f"{counter}. {element}\n"
    return result


# with generator syntax
def __str__(self):
    return "\n".join(f"{c}. {elem}" for c, elem in enumerate(self.a_list, 1))

【讨论】:

    【解决方案2】:

    如果在断言之前没有向对象添加任何内容,您的__str__() 函数不会返回字符串。即使函数调用正确,也会产生断言错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多