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 ได้จากตัวอย่างด้านล่างนี้
สิ่งที่ควรใส่ใจในขณะที่เขียน 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