Python スクリプトベースの採点

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

状況に応じて、具体的なエラーメッセージを明示する必要がある場合があります。その場合は、内部例外を使用してメッセージを作成してください。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

採点時に発生したランタイムエラーメッセージを学生に提供すると、学生がメッセージの内容をもとにテストケースを漏洩させる可能性があります。そのため、次のような形式でエラーメッセージを作成することをお勧めします。

# 非推奨の場合
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