我是python编程的老师。我给学生们布置了一些家庭作业,现在我必须改正。家庭作业是按功能提交的。这样,我就可以使用importlib
中的导入模块来导入每个学生编写的函数。我把所有的测试都放在try/except块中,但当学生做错了什么(例如,要求用户输入、缩进错误等(时,主测试程序会挂起或停止。
有没有一种方法可以在不因学生的错误而停止主程序的情况下执行所有测试?
提前谢谢。
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库用于单元测试。
理想情况下,您将使用">测试环境";以防止损坏您自己的计算机。
我建议你买一台你能在网上找到的最便宜的二手笔记本电脑(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)