Search code examples
pythondebugginginterpreterkeyerror

KeyError with Python dictionary


I've been practicing on a ><> (Fish) interpreter and am stuck on an error I'm getting. The problematic code seems to be here:

import sys
from random import randint

file = sys.argv[1]
code = open(file)
program = code.read()

print(str(program))

stdin = sys.argv[2]
prgmlist = program.splitlines()
length = len(prgmlist)
prgm = {}
for x in range(0,length-1):
    prgm[x+1] = list(prgmlist[x])

The goal here was to take the code and put it into a sort of grid, so that each command could be taken and computed separately. By grid, I mean a map to a list:

{line1:["code","code","code"]
 line2:["code","code","code"]
 line3:...}

and so on.

However, when I try to retrieve a command using cmd = prgm[y][x] it gives me KeyError: 0.

Any help is appreciated.

Here's a traceback:

Traceback (most recent call last):
  File "/Users/abest/Documents/Python/><>_Interpreter.py", line 270, in <module>
    cmd = prgm[cmdy][cmdx]
KeyError: 0

And a pastebin of the entire code.

The input is the hello world program from the wiki page:

!v"hello, world"r!
 >l?!;o

Solution

  • Few issues -

    1. You are not considering the last line , since your range is - for x in range(0,length-1): - and the stop argument of range is exlusive, so it does not go to length-1 . You actually do not need to get the length of use range, you can simply use for i, x in enumerate(prgmlist): . enumerate() in each iteration returns the index as well as the current element.

      for i, x in enumerate(prgmlist, 1):
          prgm[i] = list(x)
      
    2. Secondly, from your actual code seems like you are defining cmdx initially as 0 , but in your for loop (as given above) , you are only starting the index in the dictionary from 1 . So you should define that starting at 1. Example -

      stacks, str1, str2, cmdx, cmdy, face, register, cmd = {"now":[]}, 0, 0, 1, 0, "E", 0, None 
      

      And you should start cmdy from 0 . Seems like you had both of them reversed.