現在、アセンブラーをコーディングしようとしていますが、このエラーが発生し続けます。
トレースバック(最新の呼び出しが最後): registerTable [item]: KeyError: 'LD'
私は現在このコードを持っています:
functionTable = {"ADD":"00",
"SUB":"01",
"LD" :"10"}
registerTable = {"R0":"00",
"R1":"00",
"R2":"00",
"R3":"00"}
accumulatorTable = {"A" :"00",
"B" :"10",
"A+B":"11"}
conditionTable = {"JH":"1"}
valueTable = {"0":"0000",
"1":"0001",
"2":"0010",
"3":"0011",
"4":"0100",
"5":"0101",
"6":"0110",
"7":"0111",
"8":"1000",
"9":"1001",
"10":"1010",
"11":"1011",
"12":"1100",
"13":"1101",
"14":"1110",
"15":"1111"}
source = "LD R3 15"
newS = source.split(" ")
for item in newS:
if item in functionTable[item]:
functionField = functionTable[item]
else:
functionField = "00"
if item in registerTable[item]:
registerField = registerTable[item]
else:
registerField = "00"
print(functionField + registerField)
ヘルプは大歓迎です。
通常は _.get
_ をデフォルトで使用します
get(key[, default])
Keyが辞書にある場合はkeyの値を返し、そうでない場合はデフォルトを返します。デフォルトが指定されていない場合は、デフォルトでNoneに設定されるため、このメソッドはKeyErrorを発生させません。
したがって、get
を使用すると、ループは次のようになります。
_for item in newS:
functionField = functionTable.get(item, "00")
registerField = registerTable.get(item, "00")
print(functionField + registerField)
_
印刷するもの:
_1000
0000
0000
_
キーがディクショナリにあるかどうかを明示的にチェックする場合は、キーがディクショナリにあるかどうかを確認する必要があります(インデックス作成なし!)。
例えば:
_if item in functionTable: # checks if "item" is a *key* in the dict "functionTable"
functionField = functionTable[item] # store the *value* for the *key* "item"
else:
functionField = "00"
_
しかし、get
メソッドはコードをより短く、より速くするので、実際には後者のアプローチを使用しません。コードが失敗した理由を指摘するだけでした。
RegisterTableにはキー「LD」はありません。ブロック以外のtryを配置できます:
try:
a=registerTable[item]
...
except KeyError:
pass
潜在的なキーitem
が辞書のitem
に存在するかどうかを確認しています。テストでルックアップを削除するだけです。
_if item in functionTable:
...
_
これは改善される可能性もありますが。
アイテムを検索しようとしているようです。デフォルトは「00」です。 Python辞書には、値を取得しようとする、またはデフォルトで他の何かに設定するための組み込み関数.get(key, default)
があります。
試してください:
_functionField = functionTable.get(item, '00')
registerField = registerTable.get(item, '00')
_