Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError

Posted

技术标签:

【中文标题】Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError【英文标题】:Pyhton exercise : Raise the exception SyntaxError if s is NOT in the format specified above 【发布时间】:2021-12-19 02:08:27 【问题描述】:

我在要求我做的 codio 上做练习

如果 s 不是上面指定的格式,则引发异常 SyntaxError 如果 s 是上述格式,则引发异常 ValueError,但罚分大于标记

现在下面的代码工作得很好,我确信我并没有走得太远,但是缺少一些东西

当我在 codio 中测试我的代码时,我得到以下信息

FAIL: test_2 (test_calculate_mark.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/codio/workspace/.guides/secure/calculate_mark/test_calculate_mark.py", line 17, in test_2
    calculate_mark("john xx 30")
AssertionError: SyntaxError not raised : ----------------------------------------------------------------------

我们尝试过: calculate_mark("john xx 30") 并没有得到SyntaxError 异常

def calculate_mark(s):

  mystring= s.split()

  m=s.replace(" ", "")
  try:
    
    assert m.isdigit() == True, "SyntaxError"
    student_number=(mystring[0])
    student_mark=int((mystring[1]))
    student_penanlty=int((mystring[2]))
    assert student_penanlty <student_mark , "ValueError"
    mycalc=student_mark-student_penanlty
    final_mark=student_number + " "+  str(mycalc)
    return final_mark

  except AssertionError as msg:
    print(msg)



calculate_mark("123 35 50") 

【问题讨论】:

正如 Nils 所说,您使用 raise 引发异常,而不是 assert。这适用于您在此处使用assert。如果您的测试应用需要捕获您的异常,您当然不想使用try/except assert 的第二个参数是 reason,它包含在引发的 AssertionError 中。也就是说,如果你打印str(msg),你会得到你指定的原因(例如上面指定的'SyntaxError') 【参考方案1】:

您实际上必须raise Exception:

raise SyntaxError()

然后把它清理干净

def calculate_mark(s):
    splits = s.split()

    try:
        splits = [int(s) for s in splits]
    except ValueError:  # at least one of splits is not an integer
        raise SyntaxError("Please pass exactly three integer strings")

    number, mark, penalty = splits

    if penalty < mark:
        raise ValueError("penalty must be larger than mark")
    
    return f"number mark - penalty"

print(calculate_mark("123 35 50"))

【讨论】:

永远不要与 True 比较。只需写if not m.isdigit(): 哎呀,你是对的,我只是盲目地复制了 Q 中的内容。

以上是关于Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python去掉指定的字符串

练习-文本日志增加删除(指定字符串格式)

python练习:假设s是一个字符串,返回s中十进制数字之和。例如,如果s是‘a2b3c’,则返回5。

linux练习题

python练习题4.28矩阵转置

python练习第五天