grader.sh은 학습자가 제출 버튼을 눌렀을 때 실행되며 grader.sh에서 grader.py를 실행하여 채점을 시작합니다. grader.py를 작성하기 위해 자주 사용되는 elice_utils.py의 함수들에 대해 일반적인 형식과 함께 설명하겠습니다.
secure_send_grader(): 터미널을 통해 사용자에게 메세지 출력
secure_send_score(): 실습의 최종 점수 설정
from grader_elice_utils import EliceUtilselice_utils =EliceUtils()elice_utils.secure_init()# elice_utils 가져오고 초기화합니다.try:# 채점을 진행합니다. elice_utils.secure_send_grader('문자열')# 학습자의 터미널 창에 문자열을 전송합니다. elice_utils.secure_send_score(100)# 학습자의 실습 점수를 전송합니다. 100점 획득 시, 정답 토끼가 팝업됩니다.exceptException:# 채점 진행과정에서 오류가 발생하는 경우 elice_utils.secure_send_score(0)# 실습 점수를 0점으로 설정 sys.exit(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')exceptException: elice_utils.secure_send_grader('상대도수가 제대로 계산되지 않았어요. 다시 한번 계산해볼까요?\n')
import student_codestry:if student_codes.answer ==12: total_score +=100 elice_utils.secure_send_grader('정답!\n')# index range errorexceptIndexError: elice_utils.secure_send_grader('인덱스가 지정된 범위를 벗어났어요.\n')# name errorexceptNameError: elice_utils.secure_send_grader('선언하지 않은 변수를 사용했어요.\n')# zero division errorexceptZeroDivisionError: elice_utils.secure_send_grader('0으로는 나눌 수 없어요.\n')
유의사항 3
채점시 발생한 RuntimeError 메세지를 학생에게 제공한다면, 역으로 학생이 메시지 내용을 기반으로 테스트케이스를 유출할 수 있습니다. 따라서 다음과 같은 형태로 에러 메세지를 작성하는 것을 권장합니다.
# 권장하지 않는 경우try:# 채점 코드 작성exceptExceptionas err: elice_utils.secure_send_grader('Internal Error:\n%s\n'%str(err)) elice_utils.secure_send_score(0) sys.exit(1)# 권장하는 방법try:# 채점 코드 작성exceptException: elice_utils.secure_send_grader('채점 도중 오류가 발생했어요. 코드가 정상적으로 실행되는지 확인해보세요.\n') elice_utils.secure_send_score(0) sys.exit(1)"""만약 권장하지 않는 경우로 채점 코드를 작성했을 경우?"""# grader.py 전문 출력 가능raiseException(open('.elice/grader.py').read())