メインコンテンツまでスキップ

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/ja/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('0で割ることはできません。\n')

留意点 3

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

# お勧めしない場合
try:
# 採点コードを作成
except Exception as err:
elice_utils.secure_send_grader('内部エラー:\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())