Python การตรวจคะแนนโดยใช้สคริปต์พื้นฐาน

grader.sh ถูกเรียกใช้เมื่อผู้เรียนกดปุ่มส่งและจะเรียกใช้ grader.py เพื่อเริ่มต้นกระบวนการตรวจคัดข้อสอบ ในการเขียน grader.py ฉันจะอธิบายรูปแบบทั่วไปของฟังก์ชันที่ใช้บ่อยใน elice_utils.py

  • secure_send_grader(): ส่งข้อความไปยังผู้ใช้ผ่านทางเทอร์มินอล

  • secure_send_score(): ตั้งค่าคะแนนสุดท้ายของการปฏิบัติการ

from grader_elice_utils import EliceUtils
elice_utils = EliceUtils()
elice_utils.secure_init() # โหลดหน้า elice_utils เข้ามาและเริ่มต้นใช้งาน

try: # เริ่มกระบวนการตรวจคัด
	elice_utils.secure_send_grader('สตริง') # ส่งสตริงไปยังหน้าเทอร์มินอลของผู้ใช้
	elice_utils.secure_send_score(100) # ส่งคะแนนการฝึกหัดของผู้ใช้ ถ้าได้คะแนน 100 จะป๊อบอัพกระต่ายตอบถูกขึ้น

except Exception: # ถ้าเกิดข้อผิดพลาดในการตรวจคัด
	elice_utils.secure_send_score(0) # ตั้งค่าคะแนนการฝึกหัดเป็น 0
	sys.exit(1)

คุณสามารถปรับแก้ grader.py เพื่อทำการตรวจคัดข้อสอบโดยใช้วิธีการต่างๆ ดังตัวอย่างด้านล่าง

เราสามารถดูวิธีการเขียน grader.py ได้จากตัวอย่างด้านล่างนี้

case1. การตรวจคัดแยกการป้อนและส่งออกcase2. ตรวจสอบเงื่อนไขที่กำหนด

สิ่งที่ควรใส่ใจในขณะที่เขียน grader.py คือดังนี้

ข้อควรระวังที่ 1

บางครั้งการเปรียบเทียบค่าโดยใช้ if อาจทำให้เกิดข้อผิดพลาดเช่น TypeError, RangeError เมื่อทำการเปรียบเทียบค่าที่มีรูปแบบและชนิดไม่ตรงกัน ในกรณีนี้ Grader จะหยุดทำงานทันทีและไม่สามารถทำการตรวจคัดได้อย่างถูกต้อง ดังนั้นเมื่อใช้ if คุณควรใช้รูปแบบโค้ดที่เป็นไปตามตัวอย่างด้านล่างนี้

try:
	if (submission.drink_relfreq == drink[drink['Attend'] == 1]['Name'].value_counts(normalize=True)).all() :
		total_score += 100
		elice_utils.secure_send_grader('คุณคำนวณค่าความถี่สัมพัทธ์ได้ถูกต้อง!\n')
except Exception:
	elice_utils.secure_send_grader('ค่าความถี่สัมพัทธ์ยังคำนวณไม่ถูกต้อง ลองคำนวณอีกครั้งได้ไหม?\n')

ข้อควรระวังที่ 2

ในบางสถานการณ์ เราอาจต้องระบุข้อผิดพลาดที่เกิดขึ้นอย่างละเอียดอีกที ในกรณีนี้คุณสามารถใช้ข้อยกเว้นภายในได้เพื่อเขียนข้อความ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อยกเว้นภายในของ Python กรุณาดูที่ลิงก์นี้ https://docs.python.org/ko/3/library/exceptions.html#concrete-exceptions

import student_codes

try:
	if student_codes.answer == 12:
		total_score += 100
		elice_utils.secure_send_grader('ถูกต้อง!\n')

# ข้อผิดพลาดในช่วงของดัชนี
except IndexError:
	elice_utils.secure_send_grader('ดัชนีเกินช่วงที่กำหนด\n')

# ข้อผิดพลาดในชื่อ
except NameError:
	elice_utils.secure_send_grader('เรียกใช้ตัวแปรที่ไม่ได้ประกาศ\n')

# ข้อผิดพลาดในการหารด้วยศูนย์
except ZeroDivisionError:
	elice_utils.secure_send_grader('ไม่สามารถหารด้วยศูนย์\n')

ข้อควรระวังที่ 3

หากเราจะให้รายงานข้อผิดพลาดที่เกิดขึ้นในขณะที่กำลังตรวจคัด นักเรียนอาจใช้ข้อความที่ได้รับเป็นการตั้งค่าของเทสเคสโดยการเผยแพร่รายละเอียดของข้อผิดพลาด ดังนั้นเราแนะนำให้เขียนข้อความของข้อผิดพลาดในรูปแบบดังตัวอย่างด้านล่างนี้

# กรณีที่ไม่แนะนำ
try:
	# เขียนโค้ดตรวจคัด
except Exception as err:
	elice_utils.secure_send_grader('Internal Error:\n%s\n' % str(err))
	elice_utils.secure_send_score(0)
	sys.exit(1)

# วิธีที่แนะนำ
try:
	# เขียนโค้ดตรวจคัด
except Exception:
	elice_utils.secure_send_grader('เกิดข้อผิดพลาดระหว่างการตรวจคัด กรุณาตรวจสอบว่าโค้ดทำงานได้อย่างถูกต้องหรือไม่\n')
	elice_utils.secure_send_score(0)
	sys.exit(1)

"""
หากคุณได้เขียนโค้ดตรวจคัดด้วยวิธีที่ไม่แนะนำ อย่างไรก็ตาม?
"""
# สามารถพิมพ์เต็มโค้ดของ grader.py ได้
raise Exception(open('.elice/grader.py').read())

Last updated