Python 스크립트 기반 채점

grader.py 파일을 수정하여 채점 스크립트를 작성하는 방법을 안내합니다.

grader.sh은 학습자가 제출 버튼을 눌렀을 때 실행되며 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

상황에 따라 세부적인 오류 내용을 구체적으로 명시해주어야 하는 case가 발생할 수 있습니다. 이때는 내부 예외를 활용해 메세지를 작성해주세요. 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')

# index range error
except IndexError:
	elice_utils.secure_send_grader('인덱스가 지정된 범위를 벗어났어요.\n')

# name error
except NameError:
	elice_utils.secure_send_grader('선언하지 않은 변수를 사용했어요.\n')

# zero division error
except ZeroDivisionError:
	elice_utils.secure_send_grader('0으로는 나눌 수 없어요.\n')

유의사항 3

채점시 발생한 RuntimeError 메세지를 학생에게 제공한다면, 역으로 학생이 메시지 내용을 기반으로 테스트케이스를 유출할 수 있습니다. 따라서 다음과 같은 형태로 에러 메세지를 작성하는 것을 권장합니다.

# 권장하지 않는 경우
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