None 断言检查后函数的值

None value from a function after assert checking

我正在编写一个函数来检查笔记本文件的输出并检查断言表达式以匹配输出。但是当我打印函数的输出时,我得到了一个 None 值。

from testbook import testbook

@testbook('ssnn_solved.ipynb', execute=True)
def test_stdout(tb):
    
    score = 0.0
    
    assert tb.cell_output_text(7) == 'Test passed.' 
    return score+1
    
    assert tb.cell_output_text(13) == 'Test passed.'
    return score+1
        
    assert tb.cell_output_text(17) == 'Test passed.'
    return score+1  
    
    assert tb.cell_output_text(21) == 'Test passed.'
    return score+1
    
res = test_stdout()

print(res)

我想在 运行 断言后 return 输出为 4.0。

如果您的目标是计算成功断言的数量,那么它要么是 4,要么您无法获得它,因为出现了异常。如果您使用常规检查而不是断言,您可以更改它,因为该函数不会在它遇到的第一个虚假检查时引发错误:

@testbook('ssnn_solved.ipynb', execute=True)
def test_stdout(tb):
    score = 0
    score += tb.cell_output_text(7) == 'Test passed.' 
    score += tb.cell_output_text(13) == 'Test passed.'
    score += tb.cell_output_text(17) == 'Test passed.'
    score += tb.cell_output_text(21) == 'Test passed.'
    return score

如果你想short-circuit和return在一个错误上立即出现,在每个测试之后一个return是比较合适的。您可以在此时使用循环来(可以说)简化代码:

@testbook('ssnn_solved.ipynb', execute=True)
def test_stdout(tb):
    cells = [7, 13, 17, 21]
    score = 0
    for cell in cells:
        if tb.cell_output_text(cell) != 'Test passed.':
            break
        score += 1
    return score

使用此结构,您可以使用 sum:

重写第一个示例
@testbook('ssnn_solved.ipynb', execute=True)
def test_stdout(tb):
    return sum(tb.cell_output_text(cell) == 'Test passed.' for cell in [7, 13, 17, 21])