I'm refactoring some code that a friend wrote and recently stumbled across this function:
def setup_parameters(self, data):
'''Parse raw data to determine game settings.'''
for line in data.split('\n'):
line = line.strip().lower()
if line:
tokens = line.split()
self.L.debug("tokens: " + str(tokens))
key = tokens[0]
if key == 'cols':
self.width = int(tokens[1])
elif key == 'rows':
self.height = int(tokens[1])
elif key == 'player_seed':
random.seed(int(tokens[1]))
elif key == 'turntime':
self.turntime = int(tokens[1])
elif key == 'loadtime':
self.loadtime = int(tokens[1])
elif key == 'viewradius2':
self.viewradius2 = int(tokens[1])
elif key == 'attackradius2':
self.attackradius2 = int(tokens[1])
elif key == 'spawnradius2':
self.spawnradius2 = int(tokens[1])
As you can see, there is a nasty kind of switch statement here, that clearly calls for a dictionary. I'm tempted to write this as a class dictionary since the keys are constant, but since the keys map to attributes of an instance (ie, 'cols': self.width) this doesn't compile.
My question is then, what is the right way to refactor such code?