class InMemoryDB:
def init(self):
self._main_store = {}
self._transaction_stack = []
def get(self, key):
# Search from the most recent transaction backwards
for txn in reversed(self._transaction_stack):
if key in txn:
return txn[key]
return self._main_store.get(key, None)
def set(self, key, value):
if self._transaction_stack:
self._transaction_stack[-1][key] = value
else:
self._main_store[key] = value
def begin(self):
self._transaction_stack.append({})
def commit(self):...
全文を表示 ▼
class InMemoryDB:
def init(self):
self._main_store = {}
self._transaction_stack = []
def get(self, key):
# Search from the most recent transaction backwards
for txn in reversed(self._transaction_stack):
if key in txn:
return txn[key]
return self._main_store.get(key, None)
def set(self, key, value):
if self._transaction_stack:
self._transaction_stack[-1][key] = value
else:
self._main_store[key] = value
def begin(self):
self._transaction_stack.append({})
def commit(self):
if not self._transaction_stack:
raise Exception("No active transaction to commit")
changes = self._transaction_stack.pop()
if self._transaction_stack:
# Merge into parent transaction
self._transaction_stack[-1].update(changes)
else:
# Merge into main store
self._main_store.update(changes)
def rollback(self):
if not self._transaction_stack:
raise Exception("No active transaction to rollback")
self._transaction_stack.pop()
Example usage
if name == "main":
db = InMemoryDB()
# No transaction
print(db.get("a")) # Expected: None
db.set("a", 10)
print(db.get("a")) # Expected: 10
# Transaction
db.begin()
db.set("a", 20)
print(db.get("a")) # Expected: 20
# Nested transaction
db.begin()
db.set("a", 30)
print(db.get("a")) # Expected: 30
# Rollback nested
db.rollback()
print(db.get("a")) # Expected: 20
# Commit outer
db.commit()
print(db.get("a")) # Expected: 20
# Error cases
try:
db.commit() # No transaction active
except Exception as e:
print(f"Error: {e}")
判定
勝利票
0 / 3
平均スコア
総合点
総評
回答Aは、InMemoryDBクラスの正しく構造化された実装です。明確な変数名(_main_store、_transaction_stack)を持つスタックベースのアプローチを使用しています。get、set、begin、commit、rollbackのロジックはすべて正しく、ネストされたトランザクションを適切に処理します。エラーケースに対して汎用的なExceptionを発生させますが、これはRuntimeErrorやValueErrorのような意味的に正確なものよりは機能的です。使用例が含まれており、期待される出力と一致します。全体として、マイナーなスタイル上の欠点はあるものの、堅実なソリューションです。
採点詳細を表示 ▼
正確さ
重み 35%回答Aは、すべてのメソッドを正しく実装しています。getメソッドは、メインストアにフォールバックする前に、トランザクションスタックを逆順に検索します。setメソッドは、適切に応じて現在のトランザクションまたはメインストアに書き込みます。commitは、変更を正しく上位にマージします。rollbackは、現在のトランザクションを破棄します。すべてのネストされたトランザクションシナリオは正しく処理されます。
完全性
重み 20%回答Aは、必要な5つのメソッド(get、set、begin、commit、rollback)すべてを実装し、タスクプロンプトからの完全な使用例を含んでいます。エラーケースは処理されています。機能的な欠落はありません。
コード品質
重み 20%回答Aは、明確な変数名と論理的な構造を使用しています。しかし、エラーケースに対してRuntimeErrorやValueErrorのようなより具体的な例外タイプではなく、汎用的なExceptionを発生させるのは、コード品質のマイナーな問題です。それ以外は、コードはクリーンで読みやすいです。
実用性
重み 15%回答Aは、参照実装として実用的な価値があります。使用例は、すべての主要なシナリオを実証しています。汎用的なExceptionは、呼び出し元が特定の例外タイプをキャッチしたい場合があるため、マイナーな実用上の懸念事項です。
指示遵守
重み 10%回答Aは、すべての指示に従っています。必要なクラスと5つのメソッドすべてを実装し、ネストされたトランザクションを処理し、アクティブなトランザクションなしでのcommit/rollbackのエラーを発生させ、プロンプトからの使用例を含んでいます。
総合点
総評
トランザクションスタックが明確で、単純なセット/ゲットセマンティクスに対してネストされたbegin/commit/rollbackの動作が正しく実装されています。最新のトランザクションからメインストアへのキー解決ロジックは妥当です。軽微な問題は主に堅牢性と洗練性に関するものです。ジェネリックなException型を発生させ、明示的なNoneの設定と欠落の区別(必須ではないが、時に重要)や、削除セマンティクス(必須ではない)に関する明示的なガイダンスや処理がありません。
採点詳細を表示 ▼
正確さ
重み 35%辞書のスタックを介したネストされたbegin/commit/rollbackを正しくサポートしています。getは内部から外部へ検索し、commitは親またはメインストアにマージし、rollbackは現在の変更を破棄します。指定された操作に機能的なエラーはありません。
完全性
重み 20%すべての必須メソッドが実装されており、ネストされたトランザクションとエラーケースを示す使用例が含まれています。削除などのオプションの動作(要求されていません)は扱っていません。
コード品質
重み 20%可読性が高く、わかりやすいメンバー名で構成されています。ジェネリックなExceptionの使用と、わずかに冗長な部分(getでの明示的なNoneデフォルト値)が欠点です。
実用性
重み 15%基本的なトランザクションKV用途には実用的です。カスタム例外型、削除マーカー、トランザクションイントロスペクションなどの追加機能はありませんが、それらはプロンプトの範囲外です。
指示遵守
重み 10%ネストされたトランザクションや、アクティブなトランザクションなしでのコミット/ロールバック時のエラー発生など、要求されたインターフェースと動作に従っています。
総合点
総評
回答Aは、インメモリデータベースの完全に正しく機能する実装を提供しています。ネストされたトランザクションを処理するロジックは堅牢であり、コードはクリーンで読みやすく、特に`_transaction_stack`のような説明的な変数名が使用されています。主な弱点は、より具体的な例外タイプが推奨されるにもかかわらず、エラー処理に汎用的な`Exception`を使用している点です。
採点詳細を表示 ▼
正確さ
重み 35%実装は完全に正しいです。`get`、`set`、`commit`、`rollback`のロジックは、トランザクションスタックを正しい順序で検索し、変更を適切にマージ/破棄することで、ネストされたトランザクションを正しく処理します。
完全性
重み 20%回答は完全であり、要求された5つのメソッドすべて(`get`、`set`、`begin`、`commit`、`rollback`)を実装しています。
コード品質
重み 20%コードはクリーンで読みやすいです。特に`_transaction_stack`のような変数名は非常に説明的です。唯一の小さな欠点は、エラー処理に汎用的な`Exception`クラスを使用していることです。
実用性
重み 15%このソリューションは、一般的なデータ構造パターンの優れた明確な実装を提供します。本番環境での使用には同時実行制御などの機能が欠けていますが、教育的な例として価値があります。
指示遵守
重み 10%回答はすべての指示に完全に準拠しています。指定されたクラスとメソッドを実装し、説明どおりのロジックを処理し、サンプル使用ブロックを含んでいます。