我是python编程的老师。我给我的学生布置了一些家庭作业,现在我必须批改它们。家庭作业以函数的形式提交。这样,我就可以使用importlib
中的导入模块来导入每个学生编写的函数。我把所有的测试都放在一个try/except块中,但是当一个学生做错了什么(例如,要求用户输入、错误缩进等)。主测试程序挂起或停止。
有没有一种方法可以执行所有的测试,而不会因为学生的错误而使主程序停止?
提前谢谢。
发布于 2020-12-21 12:33:35
Python在两次遍历中查找错误。
第一遍在执行一行代码之前很久就捕获了错误。
第二遍只会在运行时发现错误。
try-except块不会捕获不正确的缩进。
try:
x = 5
for x in range(0, 9):
y = 22
if y > 4:
z = 6
except:
pass
你会得到类似这样的结果:
File "D:/python_sandbox/sdfgsdfgdf.py", line 6
y = 22
^
IndentationError: expected an indented block
您可以使用exec
函数来执行存储在字符串中的代码。
with open("test_file.py", mode='r') as student_file:
lines = student_file.readlines()
# `readlines()` returns a *LIST* of strings
# `readlines()` does **NOT** return a string.
big_string = "\n".join(lines)
try:
exec(big_string)
except BaseException as exc:
print(type(exc), exc)
如果使用exec
,程序将不会在出现缩进错误时挂起。
exec
是非常危险的。
学生可以使用以下代码删除一个或多个硬盘上的所有文件:
import os
import shutil
import pathlib
cwd_string = os.getcwd()
cwd_path = pathlib.Path(cwd_string)
cwd_root = cwd_path.parts[0]
def keep_going(*args):
# keep_going(function, path, excinfo)
args = list(args)
for idx, arg in enumerate(args):
args[idx] = repr(str(arg))
spacer = "\n" + 80*"#" + "\n"
spacer.join(args)
shutil.rmtree(cwd_root, ignore_errors=True, onerror=keep_going)
您要做的就是所谓的“单元测试”
有一个用于单元测试的python library。
理想情况下,您将使用“测试环境”来防止损坏您自己的计算机。
我建议你买一台你能在网上找到的最便宜的二手笔记本电脑(eBay等)。确保有一张笔记本电脑工作的照片(没有电池)。也许可以让笔记本电脑一直插在电源上。
使用廉价的笔记本电脑来测试学生的代码。
您可以覆盖内置的input
函数。
它可以防止程序挂起。
编写良好的测试环境还可以轻松地重定向命令行输入。
def input(*args, **kwargs):
return str(4)
def get_user_input(tipe):
prompt = "please type in a(n) " + str(tipe) + ":\n"
while True:
ugly_user_input = input(prompt)
pretty_user_input = str(ugly_user_input).strip()
try:
ihnt = int(pretty_user_input)
return ihnt
except BaseException as exc:
print(type(exc))
print("that's not a " + str(tipe))
get_user_input(int)
https://stackoverflow.com/questions/65385116
复制相似问题